AtCoder ABC204

ABC204参加しました。

atcoder.jp

 

A - Rock-paper-scissors

じゃんけん問題。一人の出せる手が3通りで2人の手が決まったとしているので、3x3の9通り書き連ねます。

解説 - AtCoder Beginner Contest 204

B - Nuts

10個以下なら考慮しなくていいです。10個以上なっている場合に回収できるのは、$A_i-10$個です。

解説 - AtCoder Beginner Contest 204

C - Tour

都市ごとに幅優先探索をします。

foreach(都市X in 全都市){
  ans += 都市Xを開始としてBFSで訪れた都市数
}

ある都市Xを開始点として、その都市から回れるだけ回っていきます。同じ都市を二度訪れても意味がないので、一度訪れた都市はメモしておいて、再び訪れたら無視します。最終的には都市Xからいける都市を全部訪れることができます。
たどり着いた都市数をカウントしておけば、都市Xをスタートとしたゴール都市数がわかります。

上記を一度の幅優先探索の結果とし、後は開始点とした都市Xを全都市for文で切り替えて行けばok。

注意点として、一度も移動しないことも許されます(つまり開始都市、終了都市が同じ)。これは、グラフで言えば自己ループを追加すればいいです。入力をそのまま受け取っても、自身の都市への経路はないので、自身の都市への経路を足しましょう。そうすれば後は上で書いたBFSがそのまま使えます。

Submission #23234504 - AtCoder Beginner Contest 204

解説 - AtCoder Beginner Contest 204

D - Cooking

各料理をオーブンA,Bどちらに割り振るかの2択で全探索した場合は、料理数が $ 2^{100} $ なので、TLEします。

また、途中で「料理時間が大きい方から」「総料理時間が短いオーブンに」割り当てればいいのではという考えに取り憑かれました。 これは公式回答ページから辿れる kanpurin.hatenablog.com でも、反例が紹介されています。

結局のところ単純な部分和DPになります。

note.com

このページがわかりやすかった。これに沿った解答をしてみました。SolveBがそれです。

Submission #23317162 - AtCoder Beginner Contest 204

解説 - AtCoder Beginner Contest 204

まとめ

最近調子が全然奮ってなかったですが、久々にCまでは解けた。 何度も思いますがDPは競プロ初心者には鬼門だと思います。やっぱり難しかった。 ただ、頻度が高い分、なんとかものにしたい。