SRM 504 250pt: MathContest
keyword
シミュレーション C++
問題概要
スタックに黒と白のボールが10^6個積まれている。一番上のボールを捨てる。捨てたボールが
- 黒: スタック内のボールの色を反転させる。
- 白: スタック内のボールの順序を逆にする。
スタックが空になるまで繰り返す。捨てた黒いボールの数を求める問題。
解法
シミュレーションするだけ(さすがに真面目に順序を入れ替えたりフリップさせていたらTLEするが)。dequeを使うと楽だった。
class MathContest { public: int countBlack(string ballSequence, int repetitions) { deque<int> Q; cout << ballSequence.length() << endl; for(int i=0; i<repetitions; i++){ for(int j=0; j<(int)ballSequence.length(); j++){ Q.push_back(ballSequence[j] == 'B' ? 1 : 0); } } bool black = true, order = true; int ret = 0; while(!Q.empty()){ int tp = order?Q.front():Q.back(); if(order){ Q.pop_front(); } else{ Q.pop_back(); } if(black ^ (tp==0)){ ret++; black = !black; } else{ order = !order; } } return ret; }