标签:codeforces 思维
题意:必须做完n个任务,每个任务的分值是1~p,现已做了k个,知道了分别得到的分数,求剩下的任务做完后能不能满足条件:总分不超过x,中位数不低于y
分析:
贪心。总分要尽可能小,并且要满足中位数的要求,所以就用y作为最小的中位数,固定中位数后,就在其前后补数让中位数真的满足条件,每次补1或者y。
脑袋中要有补数的画面感
代码:
#include<iostream> #include<cstring> using namespace std; int main() { int n,k,p,x,y; int mid; while(cin>>n>>k>>p>>x>>y){ int tmp=0,a,sum=0; for(int i=0;i<k;i++){ cin>>a; tmp+=a; if(a<y) sum++; } if(sum>n/2) cout<<"-1"<<endl; else{ int t1=min(n-k,n/2-sum); int t2=(n-k-t1)*y; if(t1+t2+tmp>x) cout<<"-1"<<endl; else{ for(int i=0;i<t1;i++) cout<<"1 "; for(int i=0;i<t2/y;i++) cout<<y<<" "; cout<<endl; } } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:codeforces 思维
原文地址:http://blog.csdn.net/ac_0_summer/article/details/46855847