解析: 这是一道相当经典的题目,有两个非常重要的知识点。
第一,就是用数学方程式来表现问题的解决方法。第二,就是线性问题最优值与中位数的关系。因为我已经学会了,所以我在这里就不累述了。
1 //UVA 11300 分金币 2 //线性问题 3 //难度:3.5 思路参考 4 //数据复杂度O(nlogn) 5 #include<stdio.h> 6 #include<algorithm> 7 using namespace std; 8 const int MAXN=1000010; 9 long long a[MAXN],c[MAXN]; 10 int main() 11 { 12 int n,i,mid; 13 long long m,min; 14 while(scanf("%d", &n) == 1){ //输入数据大,scanf与cin快 15 m = 0; 16 for(i = 1; i <= n; i ++){ 17 scanf("%lld", &a[i]); 18 m += a[i]; 19 } 20 m /= n; //m为每人最后的金币数 21 //寻找中位数 22 c[0] = 0; 23 for(i = 1; i < n; i++) 24 c[i] = c[i-1] + a[i] - m;//递推 25 sort(c,c+n); 26 mid = c[n/2]; 27 min = 0; 28 for(i = 0; i < n; i ++) 29 min += abs(c[i]-mid); 30 printf("%lld\n", min); 31 } 32 return 0; 33 }