[HAOI2008]糖果传递

洛咕

BZOJ

洛咕上的双倍经验

题意:有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。求使所有人获得均等糖果的最小代价。

分析:七夕祭的弱化版???均分纸牌的加强版???

先按照均分纸牌的做法,求出平均数ave,即每个人最终手里的糖果数,然后用他们现有的糖果数减去ave,即得到每个人需要送出或者得到的糖果数.接下来的做法就跟上面的七夕祭一样了,懒得写了.

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define LL long long
using namespace std;
inline int read(){
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')o=-1,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
const int N=1000005;
LL sum,ans,a[N],S[N];
int main(){	
	int n=read();
	for(int i=1;i<=n;++i){
		a[i]=read();
		sum+=a[i];
	}
	LL ave=sum/n;
	for(int i=1;i<=n;++i){
		a[i]-=ave;
		S[i]=S[i-1]+a[i];
	}
	sort(S+1,S+n+1);
	for(int i=1;i<=n;++i){
		ans+=abs(S[i]-S[(n+1)/2]);
	}
	printf("%lld\n",ans);
    return 0;
}

posted on 2019-07-24 10:28  PPXppx  阅读(87)  评论(0编辑  收藏  举报