UVA 11300_ Spreading the Wealth




把問題巧妙換成求解中位數問題,妙哉!




#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#define MAX(a,b) (a)>(b)?(a):(b)
using namespace std;
const int MAXSIZE = 1000010;
long long originCoins[MAXSIZE];
long long C[MAXSIZE];
long long int sum, average;
int main()
{
	int i,j,n;
	while (~scanf("%d", &n)){
		i = sum = 0;
		while (n--){
			scanf("%lld", &originCoins[i]);
			sum += originCoins[i++];
		}
		average = sum / i;
		C[0] = 0;
		for (j = 1; j < i; j++){
			C[j] = C[j - 1] - average + originCoins[j - 1];
		}
		sort(C, C + i);
		long long int x1 = C[i / 2];
		for (j = 0,sum=0; j < i; j++){
			sum += abs(x1 - C[j]);
		}
		cout << sum << endl;
	}

	return 0;
}


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