圆桌旁边有n个人,每个人有一定数量的金币,每个人可以给他左右相邻的人一些金币,最终使每个人的金币数量相等,求出被转手的金币的最小数量
#include <iostream>
#include <csdio>
#include <algorithm>
#include <cstring>
const int M=1000005;
using namespace std;
int main()
{
int n;
long long a[M],c[M];
while(scanf("%d",&n)==1)
{
long long sum=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
long long average=sum/n;
c[0]=0;
for(int i=1;i<n;i++)
{
c[i]=c[i-1]+a[i]-M;
}
sort(c,c+n);
long long x=c[n/2],ans=0;//算出这些数中的中位数。从中间往两边延伸
for(int i=0;i<n;i++)//再给定的数轴所有的n个点中,中位数离所有顶点的距离之和最小
{
ans+=abs(x-c[i]);
}
cout<<ans<<endl;
}
return 0;
}