NCPC I 2019

/*
n,m,s,d
有n瓶新水放入s个柜子,每个柜子容量是d,每个柜子一开始有si瓶旧水
现在随机在柜子里取m瓶水,使每个人都拿到旧水的概率最大化的放新水策略 
*/
#include<bits/stdc++.h>
using namespace std;

int n,m,s,d;
struct Node{
    int id,c;
}c[205];
int cmp(Node a,Node b){return a.c<b.c;}
int ans[205];

int main(){
    cin>>n>>m>>s>>d;
    for(int i=1;i<=s;i++){
        cin>>c[i].c;
        c[i].id=i;
    }
    sort(c+1,c+1+s,cmp);
    
    int p=0;
    while(n){
        ++p;
        if(n>=(d-c[p].c)){
            n-=d-c[p].c;
            ans[c[p].id]=d-c[p].c;
        }else {
            ans[c[p].id]=n;
            n=0;
            break;
        }
        if(p==s)break;
    }
    
    if(n){
        puts("impossible");
    }
    else {
        int sum=0;
        for(int i=p+1;i<=s;i++)
            sum+=c[i].c;
        if(sum<m)puts("impossible");
        else {
            for(int i=1;i<=s;i++)
                cout<<ans[i]<<' ';
        }
    }
    
}
 
原文地址:https://www.cnblogs.com/zsben991126/p/12822391.html