CodeForces 540B School Marks (贪心)

题意:先给定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("
");

    return 0;
}
原文地址:https://www.cnblogs.com/dwtfukgv/p/5702242.html