把问题巧妙换成求解中位数问题,妙哉!
#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;
}