atcoder beginner contest 028 解説
TRANSCRIPT
![Page 1: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/1.jpg)
ABC 028解説: 森田 晃平(@yosupot)
![Page 2: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/2.jpg)
A問題: テスト評価
![Page 3: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/3.jpg)
プログラムの流れ• 入力
• それがBad, Good, Great, Perfectのどれかを判別する
• 出力
練習ページ: (http://practice.contest.atcoder.jp/tasks/practice_1 )を参考に入力, 出力
判別部分C, C++ ならばif文というものを使います。
example : if (60 <= point && point <= 89) とか
![Page 4: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/4.jpg)
#include <cstdio>
int main() { int N; scanf("%d", &N); if (0 <= N && N <= 59) { printf("Bad\n"); } else if (60 <= N && N <= 89) { printf("Good\n"); } else if (90 <= N && N <= 99) { printf("Great\n"); } else if (N == 100) { printf("Perfect\n"); } return 0; }
コード例(C++)
![Page 5: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/5.jpg)
B問題: 文字数カウント
![Page 6: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/6.jpg)
プログラムの流れ• 入力
• 文字の種類ごとに出る回数を数え上げる
• 出力
練習ページ: (http://practice.contest.atcoder.jp/tasks/practice_1 )を参考に入力, 出力
![Page 7: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/7.jpg)
数え上げ部分
だいたいの言語には文字列中の文字をカウントする関数があります。
たとえばC++ならばcount(s.begin(), s.end(), ‘A’)で’A’の個数を数え上げられます
プログラムの流れ
![Page 8: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/8.jpg)
#include <iostream> #include <string> #include <algorithm>
using namespace std;
int main() { string s; cin >> s;
string AF = "ABCDEF";
int c[6]; for (int i = 0; i < 6; i++) { c[i] = count(s.begin(), s.end(), AF[i]); } // c[i] には i 文字目の個数が入っている string result = to_string(c[0]); for (int i = 1; i < 6; i++) { result += " " + to_string(c[i]); } cout << result << endl; return 0; }
コード例(C++)
![Page 9: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/9.jpg)
C問題: 数を3つ選ぶマン
![Page 10: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/10.jpg)
問題
• 異なる数が5個与えられる
• 3個足す
• できる数のなかで3番目に大きいものは?
![Page 11: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/11.jpg)
問題
A B C D E
![Page 12: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/12.jpg)
問題
A B C D Eできる数のなかで1番大きいものは?
![Page 13: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/13.jpg)
問題
A B C D Eできる数のなかで1番大きいものは?
当然 C + D + E
![Page 14: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/14.jpg)
問題
A B C D Eできる数のなかで2番目に大きいものは?
![Page 15: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/15.jpg)
問題
A B C D Eできる数のなかで2番目に大きいものは?
![Page 16: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/16.jpg)
問題
A B C D Eできる数のなかで2番目に大きいものは?
![Page 17: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/17.jpg)
問題
A B C D Eできる数のなかで2番目に大きいものは?
![Page 18: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/18.jpg)
問題
A B C D Eできる数のなかで2番目に大きいものは?
これは B + D + E になる
![Page 19: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/19.jpg)
問題
A B C D Eできる数のなかで3番目に大きいものは?
![Page 20: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/20.jpg)
問題
A B C D Eできる数のなかで3番目に大きいものは?
A B C D E
![Page 21: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/21.jpg)
問題
A B C D Eできる数のなかで3番目に大きいものは?
A B C D E
![Page 22: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/22.jpg)
問題
A B C D Eできる数のなかで3番目に大きいものは?
A B C D E
![Page 23: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/23.jpg)
問題
A B C D Eできる数のなかで3番目に大きいものは?
これは A + D + E か B + C + E のどちらかになる
A B C D E
→ max(A+D+E, B+C+E) を出力すればOK!
![Page 24: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/24.jpg)
D問題: 乱数生成
![Page 25: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/25.jpg)
問題
• 1, 2, 3, .., N から 1 個選ぶ機械がある
• この機械を3回動かして中央値がKになる確率は?
![Page 26: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/26.jpg)
問題• 中央値がKになるような機械の出力の通り数を求めてN^3で割れば良い
• たとえばN=3, K=1ならば
• (1, 1, 2) (1, 1, 3) (1, 2, 1) (1, 3, 1) (2, 1, 1) (3, 1, 1) (1, 1, 1)
• と、中央値が1となる出方が7通りある
• よって答えは 7 / 27 = 0.259259259…
![Page 27: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/27.jpg)
問題
• 中央値がKになるような機械の出力は何通りか?
• 何回Kが出力されたかで場合分けして数え上げる
![Page 28: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/28.jpg)
問題
• 当然中央値がKとなることはありえない。よって0通り。
Kが0回出力された場合
![Page 29: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/29.jpg)
問題
• 残りの2回のうち、片方がKより大きくてもう片方がKより小さければ良い
• Kより大きいもの(Bとする)はN-K個
• Kより小さいもの(Sとする)はK-1個
• 3回の出力の出る順番として(K, B, S) (K, S, B) (B, K, S) (B, S, K) (S, K, B) (S, B, K) の6通りが考えられる
• 以上まとめて (N-K) * (K-1) * 6 通り
Kが1回出力された場合
![Page 30: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/30.jpg)
問題
• 残りの1回の出力がなんであろうと中央値はKとなる
• Kではないもの(Lとする)はN-1個
• 3回の出力の出る順番として(K, K, L) (K, L, K) (L, K, K) の3通りが考えられる
• 以上まとめて (N-1) * 3 通り
Kが2回出力された場合
![Page 31: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/31.jpg)
問題
• 当然中央値はKとなる
• 当然出方は1通り
Kが3回出力された場合
![Page 32: AtCoder Beginner Contest 028 解説](https://reader031.vdocuments.site/reader031/viewer/2022021506/5884f0b71a28abf76f8b5e4b/html5/thumbnails/32.jpg)
問題
• よって全部まとめると
• (N-K) * (K-1) * 6 + (N-1) * 3 + 1 通り
• これを N^3 で割ったものが答え