89. 今日解いた問題(2022.03.25)
今日解いた問題についてまとめます。
自分で解きたい方のために、最初に問題だけ置いて、後で自分の解法を書きます。
問題一覧
- D - 8 Puzzle on Graph (Diff: 1376)
- D - An Invisible Hand (Diff: 1376)
自分の解法など
D - 8 Puzzle on Graph
頂点数 、コマ数 で互いに異なる頂点にいるという制約があるため、あり得る状態数は 通りです。これはおよそ なので、単純な探索で十分間に合います。最短手数を見つけたいので BFS でよいでしょう。
既に知っている状態は省くのですが、ここで状態の持ち方を工夫してみました。各頂点と 10 進数の桁を対応させて、その頂点に存在するコマの番号を持たせました。これで整数として状態を扱えます。目標状態は です。
D - An Invisible Hand
入力例からの考察で分かるように、「最大利益を上げられる町」が焦点になります。各町での売買数に制約は無いため、 は無意味な条件となっており、計算に使いません。
最大利益を上げるには、町 と町 ()について が最大となるようなものを見つけて、町 で買って町 で売れば良いです。これを見つければよいのですが、いくつかポイントがあります。
まず、単純な探索では計算量的に間に合わないです。上手くやって に収めたいです。次に、購入に最適な町・売却に最適な町はそれぞれ複数存在する可能性があります。入力例 2 が分かりやすいですが、この例では最大利益は となり、これは「町2 で買って、町3 で売る」「町4 で買って、町5 で売る」の2通りで達成できます。
なお、 は相異なるという条件があるので、複数の町で買えて1つの町で売れる…というパターンは考えなくてよいです。ちなみに、私はいまこの制約に気付いたので、同じ があっても対応できるアルゴリズムで通してしまいました。
今回の問題は、以下のような方法で で答えを求められます(厳密なアルゴリズムではなく、方針的なものを書いています)。 を先頭から順に見ていきます。
- の最小値 を記録する
- の最大値 を記録する。更新された場合、 とする。 であれば とする。
- 最終的な が求める答え