题目链接:http://codeforces.com/problemset/problem/609/C
题意:将一个大小为n序列重新分配,将ai-1同时aj+1算一次操作,问要多少次操作后序列中min和max的差不大于1
思路:一开始想了个很蠢的方法,各种wa,其实就只有2种情况,设平均值为x,要么把所有小于x的数变成x,要么把大于x+1的数变成x+1,分别计算这2中情况的操作数,选最大的一个
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define LL long long
using namespace std;
LL s[100030];
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
LL sum=0;
for (int i=0;i<n;i++)
{
scanf("%I64d",&s[i]);
sum+=s[i];
}
sum=sum/n;
sort(s,s+n);
LL need=0,res=0;
for (int i=0;i<n;i++)
{
if (s[i]<sum)
{
res+=sum-s[i];
need+=sum-s[i];
}
else if (s[i]>sum+1)
{
res+=s[i]-1-sum;
need-=s[i]-1-sum;
}
}
printf("%I64d\n",(res+need)/2);
}
}