C++の練習を兼ねて, AtCoder Regular Contest 109 の 問題C (Large RPS Tournament) を解いてみた.
■感想.
1. 問題C は, 解答の方針が見えなかったので, 解説を参照して, 実装したところ, AC版に到達できた.
2. 個人的には, 非常に, 不思議な感じがする問題に感じた.
3. 時間を見つけて, 引き続き, 過去問を振り返っていきたいと思う.
本家のサイト AtCoder Regular Contest 109 解説 の 各リンク を ご覧下さい.
■C++版プログラム(問題C/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
// 解き直し. // https://atcoder.jp/contests/arc109/editorial/379 // C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; using P = pair<char, char>; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) int main(){ // 1. 入力情報. int n, k; char s[111]; scanf("%d %d %s", &n, &k, s); // 2. 勝敗情報. // -> {自分, 相手} = {勝者} を 保存. map<P, char> m; m[{'R', 'R'}] = 'R', m[{'R', 'P'}] = 'P', m[{'R', 'S'}] = 'R'; m[{'P', 'R'}] = 'P', m[{'P', 'P'}] = 'P', m[{'P', 'S'}] = 'S'; m[{'S', 'R'}] = 'R', m[{'S', 'P'}] = 'S', m[{'S', 'S'}] = 'S'; // 3. 大会の勝者の得意な手は? string S(s), T(s); S = S + S; auto dfs = [&](auto&& self, string s, string &t, int k) -> void{ // 3-1. 終了条件. if(k == 0) return; // 3-2. 勝敗情報を保存. // s[i] と s[i + 1] のうち 負けない方 の 手. repex(i, 0, s.size(), 2) t[i / 2] = m[{s[i], s[i + 1]}]; // 3-3. 次の処理に渡す文字列を生成. // -> トーナメントの試合が, 1回行われたものと見るので, パラメータ の s でなく, ns を 渡す必要がある. string ns = t + t; // 3-4. 次の処理へ. self(self, ns, t, --k); }; dfs(dfs, S, T, k); // 4. 出力. printf("%c\n", T[0]); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
[入力例] 3 2 RPS [出力例] P ※AtCoderのテストケースより [入力例] 11 1 RPSSPRSPPRS [出力例] P ※AtCoderのテストケースより [入力例] 1 100 S [出力例] S ※AtCoderのテストケースより [入力例] 50 32 RSPRSSPRSSRRSPRRPRPSPPRPSRRRPPRRRSRPSSRRPSRRPSPPRR [出力例] S [入力例] 75 31 SSPRSRSSRSRPRRRRSSRPPPSRRSPSSPPRRSSRPRRSPSRRPSPPSRRPSSSPSPSRRRPRPRPPRSPRPSR [出力例] R [入力例] 100 77 RPSPPRSPRSRPRRRRSSSSPSSPRRPRRPPSPSRSSPRRSPPSRRSPRRSSRPSPSRRRSPPSRSSSSSPSSSSRRRRSSPRRSRRRPPRRRPRPPRSS [出力例] P |
■参照サイト
AtCoder Regular Contest 109