Demonstration(CodeForces-191B)贪心
Posted xxmlala-fff
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于Demonstration(CodeForces-191B)贪心的主要内容,如果未能解决你的问题,请参考以下文章