Uva11300 Spreading the Wealth

设第i个人需要给第i+1个人的金币数为xi(xi为负代表收到钱),列出一大堆方程。

设第i个人给第i-1个人的钱为xi(xi<0表示第i-1个人给第i个人钱)。计算出最后每个人应该有的钱m,解方程得xi=x1-(a1+a2+ … +a(i-1)-(i-1) * m)=x1-ti。 
答案就是让|x1-t1|+|x1-t2|+…+|x1-tn|最小,所以x1应该取这些t中的中位数。      by sdfzyhx

 1 /* UVa11300 - Spreading the Wealth */
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 long long x,n;
 8 long long a[1000100],c[1000100];
 9 int main(){
10     int i,j;
11     while(scanf("%d",&n)==1){
12         long long sum=0;
13         long long ans=0;
14         for(i=1;i<=n;i++){
15             scanf("%lld",&a[i]);
16             sum+=a[i]; 
17         }
18         sum/=n;
19         c[0]=0;
20         for(i=1;i<n;i++){
21             c[i]=c[i-1]+a[i]-sum;//C 
22         }
23         sort(c,c+n);
24         x=c[n/2];
25         for(i=0;i<n;i++)ans+=abs(x-c[i]);
26         printf("%lld
",ans);
27     }
28     return 0;
29 }
原文地址:https://www.cnblogs.com/SilverNebula/p/6039654.html