设第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 }