題目鏈接: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+" ");
}
}
}