BZOJ 1045 [HAOI2008] 糖果传递

来源:互联网 发布:定位软件开发 编辑:程序博客网 时间:2024/05/18 02:00

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);}
1 0
原创粉丝点击