您的位置:首页 > 其它

Codeforces Round #301 (Div. 2) B. School Marks(贪心)

2016-07-27 16:53 330 查看
题目地址:http://codeforces.com/problemset/problem/540/B

思路:Less表示小于y的数的个数,More表示大于y等于的数的个数。则若Less>=n/2+1时无解,则n/2+1之后应加入的元素个数num为n/2+1-More,为保证总和不超过x,每次加入最小值y。n+2/1之前应加入的元素为n-More-Less-num,同理为保证总和不超过x,每次加入1。若最终总和大于x或者总元素个数小于n,则无解。

#include<cstdio>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int num=0;
int ans[1050];
int n,k,p,x,y,Less,More,sum=0;
int main()
{
scanf("%d%d%d%d%d",&n,&k,&p,&x,&y);
for(int i=0; i<k; i++)
{
int x;
scanf("%d",&x);
sum+=x;
if(x<y) Less++;
else More++;
}
if(Less>=n/2+1)
{
printf("-1\n");
exit(0);
}
int r=n/2+1-More;
while(r>0)
{
r--;
ans[num++]=y;
sum+=y;
}
int left=n-More-Less-num;
while(left>0)
{
left--;
ans[num++]=1;
sum+=1;
}
if(sum>x||num+k<n)
{
printf("-1\n");
exit(0);
}
for(int i=0; i<num-1; i++)
printf("%d ",ans[i]);
printf("%d\n",ans[num-1]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: