转换为数学模型——>求中位数
还要注意题目中要求输入的数值为64为无符号整数,所以要用long型。
import java.util.Arrays;
import java.util.Scanner;
/*
* TITLE: UVA 11300 Spreading the Wealth
* RUNTIME: 1.089 s
* TIME: 2015-11-08 15:30:04
* DISC: 要把问题转化为求中位数的数学模型
*/
public class Main {
public static void main(String[] args) {
int n ; //n个人
long coin []; //注意这些数值必须是long型,int型的话会Wrong Answer
long coinSum;
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
coinSum = 0;
n = scanner.nextInt();
coin = new long[n];
for(int i = 0 ;i< n;i++){
coin[i] = scanner.nextInt();
coinSum+=coin[i];
}
long avg = coinSum / n;
long C[] = new long[n];
C[0]=0;
long a=0;
for(int i = 1;i<n;i++){
// a+=coin[i-1];
// C[i] = a-i*avg;/
C[i]=C[i-1]+coin[i-1]-avg;
}
Arrays.sort(C);
long zhongweishu = C[n/2]; //求出C数组中的中位数
long minExchangeCoin = 0; //最小交换的金币总数
for(int i = 0 ;i<n;i++){
minExchangeCoin+= Math.abs(zhongweishu-C[i]);
}
System.out.println(minExchangeCoin);
}
}
}