UVA 11300 Spreading the Wealth

转换为数学模型——>求中位数


还要注意题目中要求输入的数值为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);
		}
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值