Codeforces Round #389 Div.2 E. Santa Claus and Tangerines
脑洞题
想明白以后其实挺简单的。然而比赛的时候理解错了题意,没做出来……
如果二分答案的话,每次二分之后暴力统计一下是否可行,好像可以跑过去。
如果贪心的话:
大概一看代码就懂了。先找出最小的一定可行的解,然后将从大到小for循环,把大橘子不断分成两半,同时检查是否可以更新答案。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #define LL long long 7 using namespace std; 8 const int mxn=10000100; 9 int n,k; 10 int ans=1; 11 LL a[mxn]; 12 int main(){ 13 int i,j; 14 scanf("%d%d\n",&n,&k); 15 LL smm=0; 16 for(i=1;i<=n;i++){ 17 scanf("%d",&j); 18 ++a[j]; 19 smm+=j; 20 } 21 if(smm<k){printf("-1\n");return 0;} 22 smm=0; 23 for(i=mxn-1;i;i--){ 24 smm+=a[i]; 25 if(smm>=k){ans=i;break;} 26 //一定可行的最小答案 27 } 28 for(i=mxn-1;i>1;i--){ 29 if(i/2<ans)break; 30 a[i/2]+=a[i]; 31 a[i-i/2]+=a[i]; 32 smm+=a[i]; 33 a[i]=0; 34 while(smm-a[ans]>=k){ 35 smm-=a[ans]; 36 ans++; 37 } 38 } 39 printf("%d\n",ans); 40 return 0; 41 }
本文为博主原创文章,转载请注明出处。