题意:
给你n个金币,然后m个人,每个人有理论的分配份额。但是金币只能整Robbers个整个分。
问你怎么分才能让金币分配的最合理;
题解:
先按比例,把能分的先都分了,最后剩余的,往余数最大的上面补。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 11111;
struct node{
int nu,fi,ans;
double tt;
}x[maxn];
int n,m,Y;
int cmp1(node a,node b){
return a.tt<b.tt;
}
int cmp2(node a,node b){
return a.nu<b.nu;
}
int main() {
int T,sum;
cin>>T;
while(T--){
memset(x,0,sizeof(x));
scanf("%d %d %d",&n,&m,&Y);sum=m;
for(int i=1;i<=n;++i) {
scanf("%d",&x[i].fi);
x[i].nu=i;
x[i].tt=m*1.0*x[i].fi/Y;
sum-=(int)x[i].tt;
x[i].ans=(int)x[i].tt;
x[i].tt-=(int)x[i].tt;
}
sort(x+1,x+n+1,cmp1);
double s=0;
for(int i=n;i>=1&&sum>0;i--){
x[i].ans+=1;
sum--;
}
sort(x+1,x+n+1,cmp2);
for(int i=1;i<n;++i) printf("%d ",x[i].ans);
printf("%d\n",x[n].ans);
}
return 0;
}