题目描述
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
输入
第一行一个正整数nn<=1’000’000,表示小朋友的个数.
接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.
输出
求使所有人获得均等糖果的最小代价。
样例输入
4
1
2
5
4
样例输出
4
题解:转自题解
AC代码:
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mmax=1e6+10;
int a[mmax],s[mmax];
int main()
{
ll n,sum=0;
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
ll ave=sum/n;
ll ans=0;
for(int i=1;i<=n;i++)
{
s[i]=a[i]+s[i-1]-ave;
}
sort(s+1,s+1+n);
for(int i=1;i<=n;i++)
{
ans+=abs(s[i]-s[(n+1)>>1]);
}
cout<<ans<<endl;
return 0;
}