CodeForces192D Demonstration
题目巨难懂的一道题目。
里面要转几个弯,还是有必要写下题解
题意:政府有N块地,现在有人想要反对政府,要举行***,向政府申请场地。
这N块第,按照里政府中心的距离远近编号为1-N, 1号地点最近。
政府总是把反对者安排到最后一块地点,但要找个理由
于是当反对者申请一块地的时候,政府就安排一个长期活动占用那个地方。当然这是要钱的
最后一块地最差,也是政府所希望的,所以政府不花钱。
现在问反对者能得到到最好的地是那一块。
有几个限制条件,也是输入数据。
地的块数,政府的钱,工作天数(也是反对者最多申请的次数)
解题思路:我们把前N-1块地排个序,然后去前k-1个数字,累加,这样能最大程度耗光政府的钱,那么我们最后一天就能申请到好的地
然后我们从头开始找最好的地
分为两种情况:
一个是这块地在我们之前已经选过,这个时候判断一下sum+b【k】和m的关系就可以
一个是这块地之前没选过,但sum+a[i]>m
里面要转几个弯,还是有必要写下题解
题意:政府有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;
}