【NOIP2002】【codevs1098】均分紙牌

小哈里發表於2018-05-12

題解

  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<<'\n';
    return 0;
}

相關文章