#301 (div.2) B. School Marks

1.题目描述:点击打开链接

2.解题思路:本题利用贪心法解决。比赛的时候看错了,把y理解成了最小值,花了半天去写一个错误的代码,最后才发现y指的是中位数。。教训颇为惨痛!本题可以先满足中位数y的要求,剩下的都设为1即可。给定了n,那么可知,至多只能有(n-1)/2个数要小于中位数y。因此可以事先统计一下输入的数中有xc1个是小于y的,,同时累加和sum。如果sum>x或c1>(n-1)/2,则无解。否则,至少还要添加max(0,(n+1)/2-(k-c1))个中位数。添加完毕之后,由于sum不能超过x,因此只用将剩下的所有数设为1即可。如果最终sum>x,那么无解,否则输出解。

3.代码:

#define _CRT_SECURE_NO_WARNINGS #include<iostream>#include<algorithm>#include<string>#include<sstream>#include<set>#include<vector>#include<stack>#include<map>#include<queue>#include<deque>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<functional>using namespace std;#define N 1000+5int n, k, p, x, y;vector<int>a;int main(){//freopen("t.txt", "r", stdin);while (~scanf("%d%d%d%d%d", &n, &k, &p, &x, &y)){int sum = 0;a.clear();int c1 = 0;for (int i = 0; i < k; i++){int sx;scanf("%d", &sx);if (sx < y)c1++;sum += sx;}if (sum>x || c1>(n – 1) / 2)puts("-1");//c1不能超过最大限制(n-1)/2else{int m = max(0, (n + 1) / 2 – k + c1);//还需要添加的中位数是0和(n+1)-(k-c1)中的较大者for (int i = 0; i < m; i++)a.push_back(y);sum += m*y;if (sum + n – k – m>x)puts("-1");else{for (int i = 0; i < n – k – m; i++)a.push_back(1);int len = a.size();for (int i = 0; i < len; i++)printf("%d%c", a[i], i == len – 1 ? '\n' : ' ');}}}return 0;}

收敛自己的脾气,偶尔要刻意沉默,

#301 (div.2) B. School Marks

相关文章:

你感兴趣的文章:

标签云: