codeforces B. School Marks

这道题考察的是思维,我的思路方向是正确的,就一点细节没处理好,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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值