2007年アジア予選A問題(And Then There Was One)(2007/11/13(火) 23:36:42)

2007年アジア予選A問題を解いてみた。

解法

最大の石の数10000よりも大きい配列を用意する。
必要な配列数だけ0で埋めて初期化。
消した石は1を代入しいく。(石数-1回繰り返す)

高速化

上記の解法でも普通に答えは得られるが、少し速度的に遅いので、

for(int j = 0; j < ((k % count) ? (k % count) : count); j++){

の部分で、配列を何回もグルグル回る余計な処理を無くすように、繰り返し回数を減らしている。

ソース

(目標10分以内)

#include 
using namespace std;

int main(){
    int d[20000], n, k, m;

    while(cin >> n >> k >> m, (n || k || m)){
        memset(d, 0, sizeof(int) * n);
        int i = m - 1, count = n;
        while(count-- > 1){
            d[i] = 1;
            for(int j = 0; j < ((k % count) ? (k % count) : count); j++){
                while(d[i = (i + 1) % n]);
            }
        }
        cout << (i + 1) << endl;
    }

    return 0;
}