AOJ 1159 Next Mayor

問題

Next Mayor | Aizu Online Judge

  • 円卓に並んだn人の人が碗の中のp個の石を取り合うゲーム。
  • 0番目の人から数字が大きくなる方向に碗を順番に回していく。
  • 碗に石が入っているときは石を一つ取り、入っていないときは持っている石を全てボウルに入れる。
  • 最後の石を取った時に、取った人以外が小石を持っていなければ最後の小石を取った人の勝利。
  • 勝者の番号を出力する。

方針

百万ステップで終了することが保証されているのでシミュレーション

コード

#include <bits/stdc++.h>
 
using namespace std;
typedef long long ll;
 
#define rep(i, n) for(int i=0; i<(n); ++i)

int main(void){
    int n, p;
    int cand[51];
    while(cin >> n >> p && n && p) {
        int now = 0;
        rep(i, 51) cand[i] = 0;
        while(true) {
            if(p == 1) {
                bool end = true;
                rep(i, n) {
                    if(i != now && cand[i] != 0) {
                        end = false;
                        break;
                    }
                }
                if(end) break;
            }
            if(p > 0) {
                cand[now]++;
                p--;
            } else {
                p = cand[now];
                cand[now] = 0;
            }
            now = (now == n-1 ? 0 : now+1);
        }
        cout << now << endl;
    }
}

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1884946

反省

  • 終了判定が冗長。最後の一人がp-1個持っていることだけ調べればよかった