CodeForces192D Demonstration

题目巨难懂的一道题目。
里面要转几个弯,还是有必要写下题解

题意:政府有N块地,现在有人想要反对政府,要举行***,向政府申请场地。
这N块第,按照里政府中心的距离远近编号为1-N, 1号地点最近。
政府总是把反对者安排到最后一块地点,但要找个理由
于是当反对者申请一块地的时候,政府就安排一个长期活动占用那个地方。当然这是要钱的
最后一块地最差,也是政府所希望的,所以政府不花钱。
现在问反对者能得到到最好的地是那一块。
有几个限制条件,也是输入数据。
地的块数,政府的钱,工作天数(也是反对者最多申请的次数)

解题思路:我们把前N-1块地排个序,然后去前k-1个数字,累加,这样能最大程度耗光政府的钱,那么我们最后一天就能申请到好的地
然后我们从头开始找最好的地
分为两种情况:
一个是这块地在我们之前已经选过,这个时候判断一下sum+b【k】和m的关系就可以
一个是这块地之前没选过,但sum+a[i]>m


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<functional>
#define ll long long
using namespace std;
ll a[100005];
ll b[100005];
bool cmp(ll a,ll b)
{
	return a>b;
}
int main()
{
	ll i,n,m,k;
	memset(a,0,sizeof a);
	memset(b,0,sizeof b);
	scanf("%lld%lld",&n,&k);
	scanf("%lld",&m);
	//printf("n=%lld k=%lld m=%lld\n",n,k,m);
	for(i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		b[i]=a[i];
	}
	sort(b+1,b+n,cmp);
	ll sum=0;
	for(i=1;i<k;i++)
		sum+=b[i];
	for(i=1;i<=n;i++)
	{
		if(a[i]>=b[k])//这块地在之前出现过
		{
			if(sum+b[k]>m)//判断前K块地是否超过政府预算
			{
				cout<<i<<endl;//超过之后只需要调整下申请顺序
				return 0;//就可以得到最后的地
			}
		}
		else if(sum+a[i]>m)//没出现过
		{//累加超过政府预算
			cout<<i<<endl;
			return 0;
		}
	}
	cout<<n<<endl;//只能得到最后一块地
	return 0;
}










全部评论

相关推荐

点赞 评论 收藏
分享
双非坐过牢:非佬,可以啊10.28笔试,11.06评估11.11,11.12两面,11.19oc➕offer
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务