CodeForces192D Demonstration

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

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

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


#include
#include
#include
#include
#include
#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=b[k])//这块地在之前出现过
		{
			if(sum+b[k]>m)//判断前K块地是否超过政府预算
			{
				cout<m)//没出现过
		{//累加超过政府预算
			cout<










你可能感兴趣的:(CodeForces192D Demonstration)