传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1045
Solution
最终状态为原始糖果a平均值,记为adv
因为这是一个环,直接求不好做
考虑一下p数组表示每个孩子给了前面多少东西(可以是负的表示倒抽……)
那么有
a1−p1+p2=adv
a2−p2+p3=adv
……
用第一条式子代入后面的并且整理一下
可以有
p2=p1−(a1−adv)
p3=p1−(a1+a2−2adv)
……
后面括号内的内容记作c
可得
ci=ci−1+ai−adv
我们需要
∑i=1n|pi|
最小化
那么注意到这东西是
∑i=1n|p1−ci|
即在数轴上
p1
对应点到所有c的距离和最短
那么这个点就是c的中位数了
顺带一提,数据范围卖萌的,记得好像远古年代还不是这个数据范围的……
#include<stdio.h>
#include<algorithm>
#define N 1000005
typedef long long ll;
using namespace std;
int a[N],n;
ll ans,adv,c[N];
int main()
{
scanf("%d",&n);
for (int i=0;i<n;i++) scanf("%d",a+i),adv+=a[i];
adv/=n;
for (int i=0;i<n;i++) c[i]=c[i-1]+a[i]-adv;
sort(c,c+n);
adv=c[n>>1];
for (int i=0;i<n;i++) ans+=abs(c[i]-adv);
printf("%lld",ans);
}