92. 今日解いた問題(2022.03.29)
今日解いた問題についてまとめます。
自分で解きたい方のために、最初に問題だけ置いて、後で自分の解法を書きます。
問題一覧
- C - Linear Approximation (Diff: 1089)
- E - Get Everything (Diff: 1397)
2 問目が個人的に面白かったです。
自分の解法など
C - Linear Approximation
予め を計算しておけば、 の総和が最小となる を求める問題になります。
考えやすくするため、 は昇順に並んでいるとします。適当な数 を の値として考えてみます。 とすると、総和は だけ変化することが分かります。逆に とすると、総和は だけ変化します。これらを考慮すると、 の中央値が として最適なことが分かります。
よって、この問題は数列のソートに最も時間がかかって です。
E - Get Everything
まず、 が非常に小さいことに注目します。素直に考えると について全探索したくなるのですが、おそらく に関して全探索するのだろう、と目星をつけておきます。
個の宝箱をそれぞれビットに割り当てると、鍵が開けられる宝箱についてビットを とすることで、鍵に対して という値を算出できます。複数の鍵を組み合わせて開けられる宝箱は、 のようなビット演算で表現できます。
ここまで来たら、 のような式で費用の最小値を更新できることが見えてきます。単独の鍵で開けられるところを で初期化しておき、他は とします(加算するのでオーバーフローに注意します)。 の二重ループで DP テーブルを更新していきます。
これを 回繰り返せば DP テーブルは十分更新されるので、 が であればすべての宝箱を開けることは不可能、それ以外の場合は現在値が答えになります。
計算量は ですが、 なのでこれでも 程度のループ数に収まります。