AtCoder Beginner Contest 252 メモ(A-D)
今回の結果
2AC
B問題ではまって時間取られたし、C問題もそんなに難しい問題じゃないのにACできなかったのが痛かった。
A - ASCII code
Difficulty: 7
問題文
英小文字 a
, b
, …, z
の ASCII 文字コードはこの順に
制約
-
はN 以上97 以下の整数122
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
入出力例
入力例 1
97
出力例 1
a
入力例 2
122
出力例 2
z
参加中に考えたこと
ASCIIコードに合わせて数値型を文字に変換して出力するだけ。
B - Takahashi's Failure
Difficulty: 42
問題文
高橋君の家には
また、高橋君には嫌いな食品が
高橋君は Yes
を、食べる可能性が無いならば No
を出力してください。
制約
1≤K≤N≤100 1≤A_i≤100 1≤B_i≤N -
はすべて相異なるB_i - 入力はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
高橋君が嫌いな食品を食べる可能性があるならば Yes
を、無いならば No
を出力せよ。
入出力例
入力例 1
5 3
6 8 10 7 10
2 3 4
出力例 1
Yes
入力例 2
5 2
100 100 100 1 1
5 4
出力例 2
No
参加中に考えたこと
やるべきことを順に整理すると、以下の2ステップでいける
-
の中から最大のおいしさを求める(A とする)Amax -
の食品の中にAi = Amax が含まれているかを調べるB
食品数は最大で100なので、多重ループでも計算量は気にしなくて大丈夫。
C - Slot Strategy
Difficulty: 441
問題文
それぞれのリールには対応するボタンがついており、高橋君は各非負整数
スロットが回り始めてから
ただし、
高橋君は全てのリールを止めた上で、表示されている文字が全て同じであるようにしたいです。
高橋君が目標を達成できるように全てのリールを止めるまでに、スロットが回り始めてから最小で何秒かかるかを求めてください。
制約
2≤N≤100 -
は整数N -
はS_i がちょうど0, 1, …, 9 回ずつ現れる長さ1 の文字列10
入力
入力は以下の形式で標準入力から与えられる。
出力
高橋君が目標を達成できるように全てのリールを止めるまでに、スロットが回り始めてから最小で何秒かかるかを出力せよ。
入出力例
入力例 1
3
1937458062
8124690357
2385760149
出力例 1
6
入力例 2
5
0123456789
0123456789
0123456789
0123456789
0123456789
出力例 2
40
参加中に考えたこと
問題文が長い。こういう時は入出力の例を見たほうが主旨の理解が早まる。
とはいえ少しややこしいのでちゃんと整理。
- 0秒からリールを押すことができる
- 同時に2つ以上のリールを止めることはできない
最小時間をどうやって探すかを考える。
どのリールを止めるかは、ある時点において次に押せるものを探して押せばよい。
あと、整理した内容の2点目から2つのリールでともに
入力例2がその例になる。(0+10+10+10+10=40秒)
この方法に適したデータの持たせ方は、
0秒目からボタンが押せるので、0オリジンで持っておく。
-
入力例1:
で止める場合8 - 0番目が1つ、1番目が1つ、6番目が1つ
- この順で8を止めれば6秒
-
入力例2:
で止める場合0 - 0番目が5つ
- 0 + 10 + 10 + 10 + 10 = 40秒
ここまで考えてコードを書いたけど、WAになる。。
考察・感想
WAになる理由どこにあるのが探して自分のミスに気付いた。
間違いに気づいたのはこのパターン。
- 入力例1 0で止める場合 → 6番目が2つ、7番目が1つ
- 誤:6+1+10=17秒
- 正:6+10=16秒
無条件に10足したらいかんよなー。
ここも愚直にループで処理していけばよかったのか?
でも自分がやりたかった合理的な解き方は公式解説にあった。
考え方は途中まで同じだけど0~9それぞれの時間を計算する際、要は一番出現位置が多いところを基準に計算すれば簡単に求められると。なるほどね。
コンテスト中はデータはpush_backで追加してたけど、試すパターン×出現位置を10x10の2次元配列で持っておくのがやりやすかったと感じる。
D - Distinct Trio
Difficulty: 884
問題文
長さ
以下の
1≤i<j<k≤N -
は相異なるA_i ,A_j, A_k
制約
3≤N≤2×10^5 1≤A_i≤2×10^5 - 入力に含まれる値は全て整数である
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
入出力例
入力例 1
4
3 1 4 1
出力例 1
2
入力例 2
10
99999 99998 99997 99996 99995 99994 99993 99992 99991 99990
出力例 2
120
入力例 3
15
3 1 4 1 5 9 2 6 5 3 5 8 9 7 9
出力例 3
355
考察・感想
時間内に解けなかったので後で考えてみた。
まず問題文の理解に時間を喰ったんだけど、これって一言で言えば重複しない3つを選ぶ方法は何通りあるか?ってことになる。
各要素ごとに何個あるかのマップで持っておいて、それを使って解く流れを考える。
重複組み合わせを使うのかと思ったけど計算がかなり大変になりそう。
発想を変えてみて、全パターンから重複があるパターンを引くのはどうか。
選ぶのは3つだから、重複するパターンは3つとも同じ、2つが同じの2パターンだからこっちのほうが計算しやすいのでは?と考えた。
全パターンの数は
あとは重複するパターンを計算する。
ここで要素ごとの個数を持つマップを
- 全て同じ場合:3個以上ある要素について
の合計_{m_i}C_3 - 2つ同じ場合:2個以上ある要素について
の合計_{m_i}C_2 × (n-m_i)
全パターン数から上の2つを引くと求めたい答えになる。
解く前にも思ったけど、後から解説を読むと予想通り解き方のパターンが多い問題だった。
DPでもできるかと最初思ったけど、組み合わせを使う方が自分はやりやすかったので、この方法で解いた。
Discussion