srm 504 mid MathContest
問題
http://www.topcoder.com/stat?c=problem_statement&pm=11233&rd=14433
- 黒と白の玉が一列に並んでいる。
- 先頭から順番に取り出す。
- 取り出した玉が
- 白なら、残った玉の順番をひっくり返す
- 黒なら、玉の色を反転させる。
方針
基本的には、素直に調べる。但し、取り出す度に、色を反転させたり順番を反転させたりするのは面倒なので、当初の順番と逆順か?当初の色と反転しているか?を保持するフラグを持っておいて、deque(先頭と末尾から取り出せるキュー)で処理。
回答例
#include <sstream> #include <string> #include <vector> #include <map> #include <algorithm> #include <iostream> #include <utility> #include <set> #include <cctype> #include <queue> #include <stack> #include <cstdio> #include <cstdlib> #include <cmath> #include <iterator> using namespace std; class MathContest{ public: bool color_invert; bool stack_revert; deque<bool> dq; char get_out(){ char out; if(stack_revert){ out = dq.back(); dq.pop_back(); } else{ out = dq.front(); dq.pop_front(); } if(color_invert){ out = !out; } return out; } int countBlack(string ballSequence, int repetitions){ dq.resize(ballSequence.size() * repetitions); for(int i = 0; i < repetitions; i++){ for(size_t j = 0; j < ballSequence.size(); j++){ dq[i * ballSequence.size() + j] = (ballSequence[j] == 'B'); } } color_invert = false; stack_revert = false; int ret = 0; char out; while(dq.size() > 0){ out = get_out(); if(out){ color_invert = !color_invert; ret++; } else{ stack_revert = !stack_revert; } } return ret; } };