はじめに
AtCoder Beginner Contest 236の復習記事です。
記事におけるScanner
クラスは、自作の入力クラスです。
コンテスト
https://atcoder.jp/contests/abc236
問題A
文字列を文字の配列としてとり、指定されたインデックスの中身を入れ替えます。
タプルを使うことで、一時変数を使わずに値を入れ替えることができます。
問題B
カードはすべて数値なので、4N
枚のカードの総和(4 * N * (N+1) / 2)
から渡されたカードの束Aの総和を引くことで、抜き取られたカードを求めることができます。
問題C
文字列をキーとした辞書を作成し、急行列車が止まる駅をチェックします。時間計算量はO(NlogN)
になります。
ほかにも、T
はS
の部分列であることが制約で保証されているため、S
を前から順に見ていったとき、次のT
と一致した場合にはYes
を表示し、T
を次に進めるといった方法でも、時間計算量O(N)
で解くことができます。
問題D
今見ている人とスコアをもって深さ優先探索を行い、すべての人がペアを組み終わったときのスコアを最大値を求めます。遷移としては、既にペアを組んでいる場合は次の人に進み、組んでいない場合は今見ている人以降のまだペアを組んでいない人とペアを組みます。
問題E
コンテスト中の考察です。
- 二部探索?
- 最初に奇数番目と偶数番目をそれぞれ分けて、もし値が増えるならそれぞれ足していくことで平均値はでそう?
- 上の方針では、
1 2 4 5 7 8
のように番目をとるとダメになる可能性がある。
解説では、平均と中央値ともに二部探索でした。
BinarySearch
は[ng, ok)
の間で、func
の判定式を使って二部探索を行う関数です。