【BZOJ】1045: [HAOI2008] 糖果传递

来源:互联网 发布:什么是网络存储 编辑:程序博客网 时间:2024/05/17 22:17

传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1045

Solution

最终状态为原始糖果a平均值,记为adv
因为这是一个环,直接求不好做
考虑一下p数组表示每个孩子给了前面多少东西(可以是负的表示倒抽……)

那么有
a1p1+p2=adv
a2p2+p3=adv
……

用第一条式子代入后面的并且整理一下
可以有
p2=p1(a1adv)
p3=p1(a1+a22adv)
……

后面括号内的内容记作c
可得ci=ci1+aiadv
我们需要i=1n|pi|最小化
那么注意到这东西是i=1n|p1ci|
即在数轴上p1对应点到所有c的距离和最短
那么这个点就是c的中位数了

顺带一提,数据范围卖萌的,记得好像远古年代还不是这个数据范围的……

#include<stdio.h>#include<algorithm>#define N 1000005typedef 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);}
0 0
原创粉丝点击