4

糖果传递

AcWing

思路

xi 表示 ii1i1 时给 n)的糖果数,为负表示 i1ixi 个。考虑求 i=1n|xi|。必须要满足线性方程组:

{a1x1+x2=a¯a2x2+x3=a¯anxn+x1=a¯

整理得

{x1x2=a1a¯x2x3=a2a¯xnx1=ana¯

对所有方程作后缀和得

{x1=x10x2=x1(n1)a¯+i=2naixn1=x12a¯+(an1+an)xn=x1a¯+an

求它们的绝对值之和的最小值,就是求一个点到 0,(n1)a¯i=2nai,2a¯(an1+an),a¯an,应取中位数为 x1。可以用 nth_element 优化到 O(n)

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1000010;
long long n;
typedef long long ll;
ll sum,res,a[N];
int main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;++i)scanf("%lld",a+i),sum+=a[i];
	sum/=n;
	for(int i=n;i>1;--i)a[i]+=a[i+1]-sum;
	a[1]=0;
	nth_element(a+1,a+(n+1>>1),a+1+n);
	for(int i=1;i<=n;++i)res+=abs(a[i]-a[n+1>>1]);
	printf("%lld",res);
    return 0;
}

本文作者:wscqwq

本文链接:https://www.cnblogs.com/wscqwq/p/17149634.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wscqwq  阅读(8)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起