1432:糖果传递
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 1362 通过数: 625
【题目描述】
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
【输入】
第一行一个正整数n≤1000000,表示小朋友的个数.
接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.
【输出】
求使所有人获得均等糖果的最小代价。
【输入样例】
4
1
2
5
4
【输出样例】
4
参考:https://loj.ac/d/931
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const int N=1e6+5;
ll a[N],sum[N],n,b[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> a[i];
sum[i]=a[i]+sum[i-1];
}
ll ave=sum[n]/n;
for(int i=1;i<n;i++)
{
b[i]=sum[n-1]-sum[i-1]-(n-i)*ave;
}
sort(b+1,b+n+1);
ll mid=b[(1+n)/2];//中位数
ll res=0;//距离之和
for(int i=1;i<=n;i++)
{
res+=abs(b[i]-mid);
}
cout << res << endl;
return 0;
}