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を使うべきだった