P2512 [HAOI2008]糖果传递

题目描述

有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。

输入输出格式

输入格式:

小朋友个数n 下面n行 ai

输出格式:

求使所有人获得均等糖果的最小代价。

输入输出样例

输入样例#1: 
4
1
2
5
4
输出样例#1: 
4

说明

对于100%的数据 n≤106

Solution:

  本题和上篇博客一样,又是一道环形均分纸牌问题,只不过本题数据比较大,注意开$long;long$和读入优化,基本就$OK$了。

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
using namespace std;
const int N=1e6+5;
ll n,a[N],sum,s[N];
il ll gi(){
    ll a=0;char x=getchar();bool f=0;
    while((x<'0'||x>'9')&&x!='-')x=getchar();
    if(x=='-')x=getchar(),f=1;
    while(x>='0'&&x<='9')a=a*10+x-48,x=getchar();
    return f?-a:a;
}
int main()
{
    n=gi();
    for(int i=1;i<=n;i++)a[i]=gi(),sum+=a[i];
    sum/=n;
    for(int i=1;i<=n;i++)a[i]-=sum,s[i]=s[i-1]+a[i];
    sort(s+1,s+n+1);
    sum=0;
    for(int i=1;i<=n;i++)sum+=abs(s[n/2+1]-s[i]);
    cout<<sum;
    return 0;
}
原文地址:https://www.cnblogs.com/five20/p/8870012.html