Demonstration(CodeForces-191B)【贪心】

题目链接:https://vjudge.net/problem/CodeForces-191B

题意:过于繁琐,略

思路:真·神级贪心题

  首先我们可以想到的是,为了在k天内选到最靠前的城市,我们要想办法在前k-1天挑选尽可能贵的城市,为第k天奠定基础。

  先对前n-1个城市的举办活动价值排序,对前k大的求和得到sum,接下来:

  <1>sum>=0,则不论前k-1天选择多么贵的城市,第k天都无法找到一个城市花光政府的钱,那么只能选择最差的城市

  <2>sum<0,按序号由小到大判断该城市是否包含在sum中或者将sum的第一项替换为该城市后sum仍小于0,如果满足条件,则该城市则为最优解

代码如下:

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,k,a[100010],val[100010];
 5 long long b;
 6 int main(){
 7     scanf("%d%d%I64d",&n,&k,&b);
 8     for(int i=1;i<=n;i++){
 9         scanf("%d",&a[i]);
10         val[i]=a[i];
11     }
12     sort(val+1,val+n);
13     long long sum=b;
14     for(int i=n-1;i>=n-k;i--)
15         sum-=val[i];
16     if(sum>=0){
17         printf("%d",n);
18     }
19     else {
20         int ans=-1;
21         for(int i=1;i<=n;i++){
22             if(a[i]>=val[n-k]||sum+val[n-k]-a[i]<0){
23                 ans=i;
24                 break;
25             }
26         }
27         printf("%d",ans);
28     }
29     return 0;
30 }

 

posted @ 2019-10-17 22:54  xxmlala  阅读(36)  评论(0编辑  收藏