C++の練習を兼ねて, AtCoder Regular Contest 011 の 問題A (A – 鉛筆リサイクルの新技術) ~ 問題B (B – ルイス・キャロルの記憶術) を解いてみた.
■感想.
1. 実装に苦労したものの, 個人的には, いずれも非常に面白い問題と感じた.
2. 時間を見つけて, 引き続き, 過去問を振り返っていきたいと思う.
■C++版プログラム(問題A/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 |
#include <bits/stdc++.h> using namespace std; int main(){ // 1. 入力情報. int m, n, N; scanf("%d %d %d", &m, &n, &N); // 2. 販売できる鉛筆の本数は? int sell = N, notRecycle = 0; while(N >= m){ // リサイクル. int recycle = (N / m) * n; // 未リサイクル分. notRecycle += N % m; // 販売. sell += recycle; // 次回リサイクルの準備. N = recycle; // printf("recycle=%d N=%d notRecycle=%d sell=%d N=%d\n", recycle, N, notRecycle, sell, N); // 不足の場合. if(N < m){ int d = min(m - N, notRecycle); N += d; notRecycle -= d; } } // 3. 出力. printf("%d\n", sell); 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 |
[入力例] 2 1 8 [出力例] 15 ※AtCoderのテストケースより [入力例] 7 4 30 [出力例] 62 ※AtCoderのテストケースより [入力例] 100 99 1000 [出力例] 90199 ※AtCoderのテストケースより [入力例] 89 73 999 [出力例] 5160 [入力例] 7 3 987 [出力例] 1725 |
■C++版プログラム(問題B/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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
// ロジック一部修正の上, 再提出. #include <bits/stdc++.h> using namespace std; #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--) #define pb push_back int alice[26]; vector<string> v; // スキップするかどうかの判定. // @param c: 対象文字. // @return : スキップするかどうかの判定結果. // true: スキップする. // false: スキップしない. bool isSkip(char c){ // コンマ, ピリオドは, スキップ. if(c == ',' || c == '.') return true; // 母音(小文字)は, スキップ. if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'y') return true; // 母音(大文字)は, スキップ. if(c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U' || c == 'Y') return true; // それ以外は, スキップしない. return false; } // 変換テーブルを作成. // @param : なし. // @return : なし. void update(){ // 小文字. // ※ 大文字('B' - 'A' など)も, 同じ結果なので省略. alice['b' - 'a'] = 1; alice['c' - 'a'] = 1; alice['d' - 'a'] = 2; alice['w' - 'a'] = 2; alice['t' - 'a'] = 3; alice['j' - 'a'] = 3; alice['f' - 'a'] = 4; alice['q' - 'a'] = 4; alice['l' - 'a'] = 5; alice['v' - 'a'] = 5; alice['s' - 'a'] = 6; alice['x' - 'a'] = 6; alice['p' - 'a'] = 7; alice['m' - 'a'] = 7; alice['h' - 'a'] = 8; alice['k' - 'a'] = 8; alice['n' - 'a'] = 9; alice['g' - 'a'] = 9; alice['z' - 'a'] = 0; alice['r' - 'a'] = 0; } int main(){ // 1. 入力情報. int N; scanf("%d", &N); rep(i, N){ char c[1010]; scanf("%s", c); string s(c); v.pb(s); } // 2. 変換テーブル更新. update(); // 3. 変換. string ans = ""; int l = v.size(); rep(i, l){ string s = v[i]; int count = 0; rep(j, s.size()){ if(isSkip(s[j])){ continue; }else{ ans += (s[j] <= 'Z') ? to_string(alice[s[j] - 'A']) : to_string(alice[s[j] - 'a']); count++; } } if(count) ans += " "; } // 4. 出力. while(ans.back() == ' ') ans.pop_back(); printf("%s\n", ans.c_str()); 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 45 46 47 48 49 50 51 52 53 |
[入力例] 3 Mozart plays magic. [出力例] 7003 756 791 ※AtCoderのテストケースより [入力例] 3 Columbus found USA. [出力例] 15716 492 6 ※AtCoderのテストケースより [入力例] 7 I have a scissors for right hand. [出力例] 85 616606 40 0983 892 ※AtCoderのテストケースより [入力例] 4 abc ab aa aiueo [出力例] 11 1 ※AtCoderのテストケースより [入力例] 4 aaa aa a aa [出力例] ※AtCoderのテストケースより [入力例] 20 Alice, a seven year old girl, is feeling bored and drowsy while sitting on the riverbank with her elder sister. [出力例] 51 659 0 52 905 6 4599 102 92 2026 285 63399 9 38 050198 238 80 520 6630 [入力例] 34 Alice leaves the tea party and enters the garden where she comes upon three living playing cards painting the white roses on a rose tree red because The Queen of Hearts hates white roses. [出力例] 51 556 38 3 703 92 9306 38 9029 280 68 176 79 380 5599 7599 1026 79399 38 283 066 9 06 30 02 116 38 49 4 8036 836 283 066 |
■参照サイト
AtCoder Regular Contest 011
Alice’s Adventures in Wonderland