题目描述
思路是将已有的数组分为>=y与<y的两堆,如果第一堆的数量超过一半,左边填1。
如果第一堆的数量小于一半并且第二堆的数量同样小于(n-1)/2,右边补y,左边补1。
最后要判断总和是否<=x。
感谢墨染空大佬的hack,有问题欢迎大家提出
代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i = a ; i < b ; ++i)
const int maxn = 1e4;
int a[maxn];
int main()
{
int n,k,p,x,y;
scanf("%d%d%d%d%d",&n,&k,&p,&x,&y);
int sum = 0 , r = 0 , cnt = 0;
rep(i,0,k)
{
int res ;
scanf("%d",&res);sum+=res;
if(res >= y)
{r+=res;cnt++;}
}
int nd = (n + 1)>>1;
if(cnt >= nd && sum + n-k <= x)
{
rep(i,0,n-k+1)cout<<1<<" ";
}
else if(cnt < nd && k - cnt <= n - nd
&& sum + (nd - cnt) * y + n - k - nd + cnt <= x)
{
rep(i,0,nd-cnt)cout<<y<<" ";
rep(i,0,n-k-nd+cnt)cout<<1<<" ";
}
else
{
cout<<-1;
}
}