POJ 3824 - Flipper
http://poj.org/problem?id=3824
概要
1 .. n の数字が書かれた n 枚のカードが左から 1 .. n と並べられている. 各カードが表か裏かは入力で与えられる.
このカードに対して n-1 回 right flip か left flip を行う.
right flip は,右端にあるカードを引っくり返してその隣のカードの上に重ねる操作を行う. left flip は左端にあるカードに対して同様の操作を行う.
例えば右端のカードが上から順に A, B, C と重なっており,その隣りのカードが D だったとき,right flip を行うと新たな右端は上から順に C, B, A, D と重なっている.
n-1 回の入力で与えられた操作を行うと最終的に1つの山ができる. この山に対して m 個の「上から i 番目のカードに書かれた数字と,そのカードの表裏」を尋ねるクエリに答える.
制約
- 2 <= n <= 100
- m については制約無し…?
解法
愚直にシミュレーションして,最終的な山の状態を求めてからクエリに答える.
poj/3824.cc1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 int main() 7 { 8 int N; 9 for (int T = 1; cin >> N && N != 0; T++) { 10 string line; 11 cin >> line; 12 vector<int> cards(N); 13 for (int i = 0; i < N; i++) { 14 cards[i] = (line[i] == 'U'); 15 } 16 17 cin >> line; 18 vector<int> lp(1, 0), rp(1, N-1); 19 int l = 1, r = N-2; 20 for (int i = 0; i < N-2; i++) { 21 if (line[i] == 'R') { 22 reverse(rp.begin(), rp.end()); 23 for (vector<int>::const_iterator it = rp.begin(); it != rp.end(); ++it) { 24 ++cards[*it]; 25 } 26 rp.push_back(r); 27 --r; 28 } else { 29 reverse(lp.begin(), lp.end()); 30 for (vector<int>::const_iterator it = lp.begin(); it != lp.end(); ++it) { 31 ++cards[*it]; 32 } 33 lp.push_back(l); 34 ++l; 35 } 36 } 37 vector<int> pile; 38 if (line[N-2] == 'R') { 39 for (vector<int>::const_reverse_iterator it = rp.rbegin(); it != rp.rend(); ++it) { 40 pile.push_back(*it); 41 ++cards[*it]; 42 } 43 for (vector<int>::const_iterator it = lp.begin(); it != lp.end(); ++it) { 44 pile.push_back(*it); 45 } 46 } else { 47 for (vector<int>::const_reverse_iterator it = lp.rbegin(); it != lp.rend(); ++it) { 48 pile.push_back(*it); 49 ++cards[*it]; 50 } 51 for (vector<int>::const_iterator it = rp.begin(); it != rp.end(); ++it) { 52 pile.push_back(*it); 53 } 54 } 55 56 int M; 57 cin >> M; 58 cout << "Pile " << T << endl; 59 while (M--) { 60 int q; 61 cin >> q; 62 cout << "Card " << q << " is a face " << (cards[pile[q-1]] % 2 == 1 ? "up" : "down") << " " << pile[q-1]+1 << "." << endl; 63 } 64 } 65 return 0; 66 }