这道题bzoj上写的数据范围好鬼畜啊= =
其实是假的 真正的数据范围是100w
把每个人手里的糖求出平均数a
设xi为第i个小朋友给第i-1个小朋友的糖果数(可以为负)
那么答案即为|x1|+|x2|+…+|xn|
然后我们可以发现a1-x1+x2=a
a2-x2+x3=a
a3-x3+x4=a
…
an-xn+x1=a
设ci=xi-a
那么我们发现x2=x1-c1
x3=x2-c2
…
那么这个问题就转化成了最小化|xi|+|x1-c1|+|x2-c2|+…+|x1-cn-1|
其实就是求一个中位数
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=1000005;
int n=0;
int a[N],av=0,c[N];
long long sum=0;
int main(void) {
scanf("%d",&n);
for (int i=1;i<=n;++i) {
scanf("%d",a+i);
sum+=a[i];
}
av=sum/n;
for (int i=2;i<=n;++i)
c[i]=c[i-1]+a[i]-av;
sort(c+1,c+n+1);
int m=c[(n>>1)+1];
long long ans=0;
for (int i=1;i<=n;++i)
ans+=abs(c[i]-m);
printf("%lld\n",ans);
return 0;
}