Zoj2343 Robbers java

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章