解析:  这是一道相当经典的题目,有两个非常重要的知识点。

     第一,就是用数学方程式来表现问题的解决方法。第二,就是线性问题最优值与中位数的关系。因为我已经学会了,所以我在这里就不累述了。

 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 }