描述
有 n 个小朋友坐成一圈,每人有 ai 颗糖果。每人只能给左右两人传递糖果。每人每次传递一颗糖果的代价为 1 。求使所有人获得均等糖果的最小代价。
输入描述
第一行有一个整数 n ,表示小朋友个数;
在接下来 n 行中,每行一个整数 ai。
输出描述
输出使所有人获得均等糖果的最小代价。
样例输入 1
4 1 2 5 4
样例输出 1
4
提示
数据范围与提示
对于 30% 的数据,n≤1000;
对于 100% 的数据,n≤106,保证答案可以用 64 位有符号整数存储。
上代码!
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 1000005
typedef long long ll;
int n,mid;
ll a[MAX],c[MAX],sum,ans,avg;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum+=a[i];
}
avg=sum/n;
c[1]=0;
for(int i=2;i<=n;i++) c[i]=c[i-1]+a[i]-avg;
sort(c+1,c+1+n);
mid=c[(n+1)/2];
for(int i=1;i<=n;i++) ans+=(ll)abs(mid-c[i]);
printf("%lld",ans);
return 0;
}