题意:有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
",ans);
return 0;
}