题目

有 n 个小朋友坐成一圈,每人有 a[i] 个糖果。

每人只能给左右两人传递糖果。

每人每次传递一个糖果代价为 1。

求使所有人获得均等糖果的最小代价。
image-1669623847756

题解

image-1669623900016
image-1669623921556
image-1669623949062

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=1e6+10;
int n;
LL a[N],c[N];


int main(){
    cin>>n;
    LL sum=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    LL b=sum/n;;
    for(int i=2;i<=n;i++){
        c[i]=c[i-1]+a[i]-b;
    }
    LL ans=0;
    sort(c+1,c+n+1);
    for(int i=1;i<=n;i++){
        ans+=abs(c[i]-c[n+1>>1]);
    }
    cout<<ans<<endl;
    return 0;
}