题目
July 8, 2021 · View on GitHub
有 n 个小朋友坐成一圈,每人有 a[i] 个糖果。
每人只能给左右两人传递糖果。
每人每次传递一个糖果代价为 1。
求使所有人获得均等糖果的最小代价。
输入格式
第一行输入一个正整数 n,表示小朋友的个数。
接下来 n 行,每行一个整数 a[i],表示第 i 个小朋友初始得到的糖果的颗数。
输出格式
输出一个整数,表示最小代价。
数据范围
1≤n≤1000000,
0≤a[i]≤2×109,
数据保证一定有解。
输入样例:
4
1
2
5
4
输出样例:
4
参考答案
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n,a[1000001],c[1000001],ave;ll sum;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
ave=sum/n;
for(int i=2;i<=n;i++)
c[i]=c[i-1]+a[i]-ave;
sort(c+1,c+n+1);
ll ans=0;
int mid=c[(n>>1)+1];
for(int i=1;i<=n;i++)
ans+=abs(c[i]-mid);
printf("%lld",ans);
return 0;
}