【NOIP2002】【codevs1098】均分纸牌

题解

  1. 显然纸牌总数必为n的倍数,否则无解(题目也说了
  2. 每个人和平均数(最后的纸牌数)差多少,就要从旁边的人手中拿多少张牌。
  3. 即使某个时刻某人手中的牌是负数也没有关系,可以认为是他a[i]从a[i+1]手中拿牌发生在a[i-1]从a[i]手中拿牌之前。

所以,直接算出平均数。
然后遍历序列,未达到的就从右边的拿那么多张牌,累加答案操作次数。

代码

#include<iostream>
using namespace std;
const int maxn = 110;
int a[maxn], sum, ans;
int main(){
    int n;  cin>>n;
    for(int i = 1; i <= n; i++){
        cin>>a[i];  sum += a[i];
    }
    sum /= n;
    for(int i = 1; i <= n; i++){
        if(a[i] != sum){
            ans++;
            a[i+1] -= sum-a[i];
        }
    }
    cout<<ans<<'
';
    return 0;
}
原文地址:https://www.cnblogs.com/gwj1314/p/9444861.html