解题思路:
首先要使用递推推出每个人给了前一个人多少金币的公式,然后将问题转化成求数列中位数的问题(数轴上找一个到所有点距离和最小的点,这个点就在中位数的位置)
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
long long a[1000005],c[1000005],sum,avg,tmp;
int main()
{
while(~scanf("%d",&n))
{
sum=0;
for(int i=0;i<n;i++)
scanf("%lld",&a[i]),sum+=a[i];
avg = sum/n;
c[0]=a[0]-avg;
for(int i=1;i<n;i++)
c[i]=c[i-1]+a[i]-avg;
sort(c,c+n);
tmp=c[n/2],sum=0;
for(int i=0;i<n;i++)
sum+=abs(tmp-c[i]);
printf("%lld\n",sum);
}
return 0;
}