AOJ 1129 Hanafuda Shuffle
問題
Hanafuda Shuffle | Aizu Online Judge
N枚のカードの山のp番目からc枚を抜き出して一番上に持ってくるシャッフルを繰り返したときに一番上に来るカードは何か
方針
シャッフルをそのまま実行する
コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, n) for(int i=0; i<(n); ++i) int main(void){ int n, r; while(cin >> n >> r && n && r) { vector<int> card(n); vector<int> tmp(n); rep(i, n) card[i] = n-i; rep(i, r) { int p, c; cin >> p >> c; rep(j, n) tmp[j] = card[j]; rep(j, c) tmp[j] = card[p-1+j]; rep(j, p-1) tmp[c+j] = card[j]; rep(j, n) card[j] = tmp[j]; } cout << card[0] << endl; } }
http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1884750
反省
- 最終的に一番上になる一枚だけに着目する方法が賢いらしい
- 愚直にやるにしてもstd::rotate - cppreference.comを使うべきだった