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; }