您的位置:首页 > 其它

BZOJ 1045 [HAOI2008] 糖果传递

2016-11-07 20:22 218 查看
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: