这道题考察的是思维,我的思路方向是正确的,就一点细节没处理好,wa了,。这道题可以这样理解,因为要你输出一些位子上面的元素,换句话说这个数组的元素的值是可以知道的,那么该如何确定这些元素呢?题目要求这个数组是从小到大排序的,中位数上面的数字比它前面的数字要大于或等于,比它后面的数字要小于或等于,中位数又要求要大于或等于y,那么我们可以统计出在输入的k个数字中,有多少个数字比这个数字小,有多少个数字比这个数字大于或等于,因为比中位数大的有(n+1)/2-1个,同理比中位数小的有(n+1)/2-1。比中位数小的数字的个数小于(n+1)/2-1,这些数字按1来算,比中位数大的数字的个数小于(n+1)/2-1,这些数字按y来算。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
int num1,num2,n,k,p,x,y,a,i;
while(cin>>n>>k>>p>>x>>y) {
num1=0,num2=0;
int sum1=0,sum2=0;
for(i=0; i<k; i++) {
cin>>a;
if(a<y) {
num1++;
sum1+=a;
}
else {
num2++;
sum2+=a;
}
}
int val = x-(sum1+sum2);
if(val<(n-k)) cout<<-1<<endl;
else {
if(num1>=(n+1)/2) cout<<-1<<endl;
else {
int b=(n+1)/2;
int s[1010],index=0;
int ans=0;
if(num2>=b) {
ans+=(n-num2-num1);
int t=num1+num2;
while(t<n) {
s[index++] = 1;
t++;
}
}
else {
ans+=(b-1-num1);
ans+=(b-num2)*y;
while(num1<b-1) {
s[index++] =1;
num1++;
}
while(num2<b) {
s[index++] = y;
num2++;
}
}
if(ans<=val) {
cout<<s[0];
for(int i=1; i<index; i++) cout<<' '<<s[i];
cout<<endl;
}
else cout<<-1<<endl;
}
}
}
return 0;
}