题意:最均衡地分配硬币。
先分配给所有人的数量向下取整,然后取不公程度最大的几个人加1。因为向下取整丢失了小数,而一个数向下取整时小时丢得最多,向上取整获得就越少。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #include <stack> #define mkp make_pair using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=1050,INF=0x7FFFFFFF; lon arr[SZ],res[SZ]; struct nd{ double val; int id; nd(double a,int b):val(a),id(b){} bool operator<(const nd& rbs)const { return val<rbs.val; } }; int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { lon n,m,y; cin>>n>>m>>y; priority_queue<nd> pq; int cnt=0; for(int i=1;i<=n;++i) { cin>>arr[i],res[i]=arr[i]*m/y; if(fabs(res[i]-(1.0*arr[i]*m/y))>EPS) { pq.push(nd(fabs(res[i]-(1.0*arr[i]*m/y)),i)); } cnt+=res[i]; } int num=m-cnt; for(;num--;) { nd top=pq.top(); pq.pop(); ++res[top.id]; } for(int i=1;i<=n;++i) { if(i!=1)cout<<" "; cout<<res[i]; }cout<<endl; } return 0; }