题意:先给定5个数,n, k, p, x, y。分别表示 一共有 n 个成绩,并且已经给定了 k 个,每门成绩 大于0 小于等于p,成绩总和小于等于x,
但中位数大于等于y。让你找出另外的n-k个成绩。
析:利用贪心算法,首先是只能小于等于 p,也就是成绩越小越好, 然后中位数还得大于等于y,所以我们放的成绩只有两个,一个是1,另一个是y,那么是最优的,
所以每次只要判定这个就好,在判定的时候,要先排序,再找中位数,再就是每次放两个,如果n-k不是偶数,那么就放一个数,再进行。
代码如下:
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 1e5 + 5; const int INF = 0x3f3f3f3f; vector<int> ans; int a[1005]; int main(){ int n, m, p, x, y, k; scanf("%d %d %d %d %d", &n, &k, &p, &x, &y); int sum = 0; for(int i = 0; i < k; ++i){ scanf("%d", &a[i]); sum += a[i]; } int ds = x - sum; int dn = n - k; bool ok = true; if(dn & 1){ sort(a, a+k); if(a[k/2] >= y){ ans.push_back(1); a[k++] = 1; ds--; } else{ ans.push_back(y); a[k++] = y; ds -= y; } dn = n - k; } for(int i = 0; i < dn; i += 2){ sort(a, a+k); int mid = a[k/2]; if(mid < y){ ans.push_back(y); ans.push_back(y); ds -= y * 2; a[k++] = y; a[k++] = y; } else { a[k++] = 1; ans.push_back(1); a[k++] = 1; sort(a, a+k); if(a[k/2] < y){ a[0] = y; ds -= y + 1; ans.push_back(y); } else{ ds -= 2; ans.push_back(1); } } } sort(a, a+k); if(a[k/2] < y || ds < 0) printf("-1"); else for(int i = 0; i < ans.size(); ++i) if(!i) printf("%d", ans[i]); else printf(" %d", ans[i]); printf("\n"); return 0; }
时间: 2024-10-23 01:27:49