AtCoder Beginner Contest 140

結果

順位   196th / 5446
パフォーマンス   2058
レーティング  1855 → 1877(+22)

 E問題まで素早く解けたのに結局F問題を解けなくてそこまで伸びきらなかった。残念。

A - Password

 A問題のページを開いておくのを忘れていてやや時間がかかってしまった。

 提出

B - Buffet

 問題文が頭の中に入ってこなくて少し焦った。B問題にしては難しめ?

 提出

C - Maximal Value

 すぐにはわからなくて紙とペンを使って考えた。 A_iが影響し得るのは B_i B_{i + 1}に対してなので、つまりその両方を見て小さい方までは大きくできる。番兵入れようかなとか少し思ったけど両端だけ特別扱いして書いた。

 提出

D - Face Produces Unhappiness

 1回の操作で幸福である人数が増えるのがそもそも回転させる両端の二人が限界で、それは同じ向きになっている切れ目を探せば良いという考えから、具体的に回数を求めようとしたら本当に切れ目の数を数えれば良いというだけなことがわかって上手く解けた。

 提出

E - Second Sum

 まぁなんとなくこういうのは「各数字が何回2番目になるか」ということを数えたくなる。そうなれば大きい方から数字の場所を見ていくというのは自然。そして自分より大きい数字を自分より右側で一つだけ含むか、自分より左側で一つだけ含むかという場合分けをすればあとは流れで実装していくうちに煮詰まっていくという感じ。最初は番兵を識別するために位置だけじゃなくて数字も必要かなと思って{ 位置, 数字 }のペアをstd::setに詰めていっていたんだけど、実装をいろいろ変えているうちに使わなかった。

 提出

F - Many Slimes

 一番大きいものに二番目以降のものを大きい順に N個くっつけて、その次は二番目のものにまたそれ以降のものを大きい順に適切な数くっつけて……と貪欲にやっていくことがいけそうと思い実装してWAでずっと困っているうちに終わった。これは考え方が間違っていて

3
5 4 3 2 1 1 1 1

をNoと判断してしまう。こういう後ろの方で同じ数がたくさんある場合は5から1を生やすようなパスが必要なので。今日解き直していてもこれがずっとわからなくて詰まってしまったし、間違っている理由がわかった後も正しい答えの実装がわからなくてかなり時間がかかった。感覚的に合ってそうと思ったらすぐ実装し始めてしまい、それでハマるとどれだけ時間があっても無理。解法の証明のしないやり方の悪い面が出た。

 提出