题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2343
题目大意:有N劫匪去抢银行,总计抢了M个金币,Y是每个劫匪的贡献度。
Sample Input
1
3 10 4
1 1 2
Sample Output
2 3 5
我们来看输入数据--->1是有一组测试
3是有3个劫匪,总计抢了10个金币,总计4点贡献度。
第一个1是第一个劫匪的贡献度,第二个1是第二个劫匪的贡献度,第三个同理。
他们也要按劳分配。就是每个劫匪的|Xi/Y - Ki/M|的总和最小,也就是我理解的按劳分配,尽量让每个人都满意,所以贡献比和获得金钱数比的差值应该最小。
注:如果理解不了|Xi/Y - Ki/M|,可以直接看代码的这一段 bool[i]=(num[i]*1.0/y*1.0-f[i]*1.0/ m*1.0);
最后附上AC代码:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
while(T-->0)
{
int n=sc.nextInt();
int m=sc.nextInt();
int sum=m; //记录下总共的金币数
int y=sc.nextInt();
int num[]=new int[n]; //记录每个劫匪的贡献度
int f[]=new int[n]; //每个劫匪获得的金币数
double bool[]=new double[n];
for(int i=0;i<n;i++)
{
num[i]=sc.nextInt();
f[i]=(int) (m*(num[i]*1.0/y));
sum-=f[i];
}
while(sum>0)
{
double max=-9999;
for(int i=0;i<num.length;i++)
{
bool[i]=(num[i]*1.0/y*1.0-f[i]*1.0/ m*1.0);
if(bool[i]>max)
max=bool[i];
}
for(int i=0;i<num.length;i++)
{
if(bool[i]==max)
{
f[i]++;
break;
}
}
sum--;
}
for(int a:f)
System.out.print(a+" ");
}
}
}