C++の練習を兼ねて, AtCoder Beginner Contest 048 の 問題C(Boxes and Candies), 問題D(An Ordinary Game) を解いてみた.
■感想.
1. とりあえず, 解説見ずに解けたので良かったと思う.
2. 問題D は, 方針が見えなかったが, 文字列の両端に着目してみたところ, 規則性を抽出できたので, 解答に辿り着いた.
※解説みたら, だいたい同じ方針だったので, 着眼点については, 及第点に到達できたと思う.
本家のサイトABC 048 / ARC 064 解説をご覧下さい.
■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 |
#include <bits/stdc++.h> using namespace std; typedef long long LL; #define FOR(i, a, b) for(LL i = (a); i < (b); ++i) int main() { // 1. 入力情報取得. LL N, X; cin >> N >> X; LL A[N] = {}; FOR(i, 0, N) cin >> A[i]; // 2. 必要な操作回数をカウントする. LL ans = 0; FOR(i, 0, N - 1) { // 2-1. キャンディを食べる個数. LL eat = max(0LL, A[i] + A[i + 1] - X); // 2-2. i番目の箱について, キャンディの個数を更新. A[i] -= max(0LL, eat - A[i + 1]); // 2-3. (i + 1)番目の箱について, キャンディの個数を更新. A[i + 1] = max(0LL, A[i + 1] - eat); // 2-4. 食べたキャンディの個数をカウント. ans += eat; } // 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 |
#include <bits/stdc++.h> using namespace std; int main() { // 1. 入力情報取得. string S; cin >> S; // 2. 文字列の両端を確認する. string ans; int l = S.size(); bool same = (S[0] == S[l - 1]); // 2-1. 両端が等しい場合. if(same) { if(l % 2 == 0) ans = "First"; else ans = "Second"; } // 2-2. 両端が異なる場合. if(!same) { if(l % 2 == 0) ans = "Second"; else ans = "First"; } // 3. 出力 ~ 後処理. cout << ans << endl; return 0; } |
■参照サイト
AtCoder Beginner Contest 048