描述
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
输入
第一行一个正整数n≤1000000,表示小朋友的个数.
接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.
输出
求使所有人获得均等糖果的最小代价。
样例输入
4
1
2
5
4
样例输出
4
题目来源
TZOJ
分析:
1、均分纸牌类型的问题,求经过处理和排序后的数列中位数,再进行累加即可。贪心or模拟。
2、不能用cin输入,scanf勉强过关,会快读最好用快读。
代码:
#include<bits/stdc++.h>
using namespace std;
long long a[1000010],b[1000010],pjs,sum=0,ans=0;
int main()
{
int n;
cin>>n;
for (int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
pjs=sum/n;
for (int i=0;i<n;i++)
{
b[i]=b[i-1]+pjs-a[i];//糖果数的差别趋势
}
sort(b,b+n);//从小到大排序
int zws=b[n/2];//中位数
for (int i=0;i<n;i++)
ans+=abs(b[i]-zws);
cout<<ans<<endl;
return 0;
}