2020年3月14日土曜日

Educational Codeforces Round 82 (Rated for Div. 2)

 Cの実装に苦労して、遅解き四完。
 Eは解きたい難易度なんだけど、コンテスト後も自力ACできなかった。

コンテストへのリンク

A. Erasing Zeroes

 "1"がなければ0
 そうでないとき、最初に"1"が現れる位置と、最後に"1"が現れる位置を調べ、その間の"0"の個数を出力。

B. National Project

 天候の良い日が多ければn日で終わる。
 そうでないときは、高品質の舗装をするのに何日かかるか調べる。

C. Perfect Keyboard

 隣り合っている文字を管理して、それらをグラフと見た(各文字が頂点、隣り合っている文字へ辺を張る)ときに、一直線にできるかどうか。

 コンテスト中はUnion-findを使ったのですが、特に必要なかったですね。連結成分が二つ以上になる場合があると思ったのかな……。

D. Fill The Bag

 mが2ベキなので、bitで考える。
 nを二進数で表したとき、立っているbitは必ず埋めなくてはいけないので、下の桁から埋めていく。

 箱が足りなければ上の桁から取ってくる。箱が2個以上余っていたら、一つ上の桁へ運ぶ。これを繰り返して、合計nにできるか調べる。

E. Erase Subsequences

 公式解説を読んでAC。

・tを二つに分けて、それぞれがsの(連続しなくて良い)部分列になっており、共通部分がなければ良い
・sの長さが400なので(三乗で?)DPしそう。

 というあたりは分かっていた。
 これらを組み合わせれば、

・まずtをt1, t2の二つに分けるのを全探索→その上でDPを使って判定

 と考えるのは自然かもしれない。けど、気付けなかった。
 気付かなかったのは、DPを考え過ぎたせいかもしれない。今回は、

・全探索→DP

 なので、最初からDPを考えるのはちょっと筋が悪かった。「何かで場合分けした上でDPを使う」というのは常套手段。頭に入れておきたい。

 t1, t2に分けた後は、二次元DPが必要そうだけど、

・DP[i]でt1をi文字まで使ったとき、t2を最長何文字まで使えるか

 として、sについて一文字ずつ更新していけば、一次元のDPで済む。

0 件のコメント:

コメントを投稿