Description
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
Input
第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的
糖果的颗数.
Output
求使所有人获得均等糖果的最小代价。
【题目分析】
中位数+结论。
【代码】
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long
ll a[1000001],f[1000001],ave,ans;
int n;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i)
{
scanf("%lld",&a[i]);
ave+=a[i];
}
ave/=n;
for (int i=1;i<=n;++i) f[i]=f[i-1]+a[i]-ave;
sort(f+1,f+n+1);
ll mid=f[n/2+1];
for (int i=1;i<=n;++i) ans+=abs(f[i]-mid);
printf("%lld\n",ans);
}