BZOJ1045/HAOI2008/糖果传递

Posted on By 二价氢

又一类均分纸牌问题,代码很详细了,两次被long long的数据范围卡23333

AC-Code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=1000005;
long long ai[MAXN],si[MAXN],k,n,avg,ans;
long long Abs(long long x)
{
    return (x<0)?(-x):(x);
}
int main()
{
    scanf("%lld",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%lld",&ai[i]);
        avg+=ai[i];
    }
    avg/=n;
    for (int i=1;i<=n;i++)
    {
        si[i]=si[i-1]+ai[i]-avg;
    }
    sort(&si[1],&si[n+1]);
    k=si[n/2];
    for (int i=1;i<=n;i++)
        ans+=Abs(si[i]-k);
    printf("%lld\n",ans);
    return 0;
}