分析:题意是:输入考试科目数 n ,已经考的科目数 k ,科目最高能考的分数 p ,总分不能超过的数 x ,中位数不能小于 y。再输入 k 个数代表已考的分数,让你任意输出剩的 n-k 门考试的分数,满足 n 门课的总分不超过 x ,中位数不低于 y .于是我们先计算已考的n门的分数加上剩下n-k门的最低分1的总和,如果超过x 就标记f=0。否则再找出大于等于y的那个最小的数放在中间,如果没有就加入一个考试成绩y,然后把已考的分数比y小的放数组b左边,大的放右边,相等的话就先填满右边,在填满左边,剩下的b数组中位数左边空的位置放1,右边的放y。
# include <stdio.h>
int main()
{
int i,j,t,n,k,p,x,y,a[1010],b[1010],f=1,sum,num,min,K,ans[1010];
scanf("%d%d%d%d%d",&n,&k,&p,&x,&y);
for(i=1;i<=k;i++)
scanf("%d",&a[i]);
for(i=1,sum=0;i<=k;i++)
sum+=a[i];
if(sum+n-k>x)
f=0;
min=10000;K=-1;
for(i=1;i<=k;i++)
if(a[i]-y<min&&a[i]-y>=0)
{
K=i;
min=y-a[i];
}
if(K==-1)
b[n/2+1]=y;
else
b[n/2+1]=a[K];
i=n/2;
j=n/2+2;
for(t=1,num=0;t<=k;t++)
if(t==K)
continue;
else if(a[t]<y)
b[i--]=a[t];
else if(a[t]>y)
b[j++]=a[t];
else
num++;
if(num<n+1-j)
j=j+num;
else
{
num=num-(n+1-j);
j=n+1;
i=i-num;
}
if(i<0||j>n+1)
f=0;
for(t=1,k=1;t<=i;t++)
ans[k++]=1;
for(t=1;t<=n+1-j;t++)
ans[k++]=y;
if(K==-1)
ans[k++]=y;
for(i=1;i<k;i++)
sum+=ans[i];
if(sum>x)
f=0;
if(f==1)
{
for(i=1;i<k-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
}
else
printf("-1\n");
return 0;
}