codeforces 540 B School Marks【贪心】

解决一个数学问题,给定k个数,要求补全剩余n-k个数使得中位数为y且总和不超过x。通过统计比目标中位数小的数来确定如何填充缺失的数值。

题意:一共n个数,给出其中k个数,要求这n个数的中位数为y,这n个数的和不超过x,补全剩下的n-k个数

 

先统计给出的k个数里面比中位数小的数,

如果cnt<=n/2,说明中位数还没有出现,把这n/2-cnt个数都补上1,剩下的都补上y

如果cnt>n/2,说明中位数不存在

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 using namespace std;
12 
13 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
14 
15 typedef long long LL;
16 const int INF = (1<<30)-1;
17 const int mod=1000000007;
18 const int maxn=100005;
19 
20 int a[maxn];
21 
22 int main(){
23     int n,k,p,x,y;
24     cin>>n>>k>>p>>x>>y;
25     int ans=0;
26     int sum=0;
27     for(int i=1;i<=k;i++){
28         cin>>a[i];
29         sum+=a[i];
30         if(a[i]<y) ans++;
31     }
32     int l,r;
33     
34     if(ans<=n/2){
35         l=min(n/2-ans,n-k);
36         r=n-l-k;    
37         sum+=l+r*y;
38 
39         if(sum>x) printf("-1\n");
40         else{
41             for(int i=1;i<=l;i++) printf("1 ");
42             for(int i=1;i<=r;i++) printf("%d ",y);
43             printf("\n");
44         }
45     }
46     else printf("-1\n");
47     return 0;
48 }
View Code

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

g0---oooooooooo

转载于:https://www.cnblogs.com/wuyuewoniu/p/4480818.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值