C++の練習を兼ねて, AtCoder Beginner Contest 053 の 問題C(X: Yet Another Die Game), 問題D(Card Eater) を解いてみた.
■感想.
1. とりあえず, 解説見ずに解けたので良かったと思う.
※解説みたら, 同じ方針だったので, 着眼点については, 及第点に到達できたと思う.
本家のサイトABC053 /ARC068 解説をご覧下さい.
■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 |
#include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { // 1. 入力情報取得. LL X; cin >> X; // 2. 合計で, X点以上得るために必要な最小の操作回数を計算. // 6 -> 5 -> 6 -> ... で, 得点すればよい筈. LL q = X / 11; LL r = X % 11; LL ans = 2 * q; if(r > 0 && r <= 6) ans++; if(r > 6) ans += 2; // 3. 出力 ~ 後処理. cout << ans << endl; return 0; } |
■C++版プログラム(問題D/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 |
#include <bits/stdc++.h> using namespace std; #define FOR(i, a, b) for(int i = (a); i < (b); ++i) int main() { // 1. 入力情報取得. int N; cin >> N; // ex. // ① 1 … 6枚, 2 … 4枚, 3 … 5枚 // ↓ 1 … 5枚, 2 … 4枚, 3 … 4枚 // ↓ 1 … 4枚, 2 … 4枚, 3 … 3枚 // ↓ 1 … 2枚, 2 … 4枚, 3 … 3枚 // ↓ 1 … 2枚, 2 … 2枚, 3 … 3枚 // ↓ 1 … 1枚, 2 … 2枚, 3 … 2枚 // ② 1 … 1枚, 2 … 1枚, 3 … 1枚 // -> 一回の操作で, 合計2枚ずつカードが減少していく. // -> 六回の操作で, 合計12枚のカードが減少した. // 上記, ① と ② を, 同じ状態と見做すことができる. map<int, int> m; FOR(i, 0, N) { int a; cin >> a; m[a]++; } // 2. mapのサイズ と mapの値の合計(= N) を比較. // -> 差分が, 偶数か奇数であるかで, 回数が変わるはず. int ans = m.size(); bool odd = (N - m.size()) % 2; if(odd) ans--; // 3. 出力 ~ 後処理. cout << ans << endl; return 0; } |
■参照サイト
AtCoder Beginner Contest 053