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

来源:互联网 发布:html源码下载 编辑:程序博客网 时间:2024/05/16 09:32

题目地址: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;}



0 0
原创粉丝点击