B - Job Assignment Editorial by maspy
一応、時間計算量 \(O(N)\) での解法を書いておきます。
https://atcoder.jp/contests/abc194/submissions/20734963
仕事 A に、\(A_i\) が最小の人 \(i\) を使い、仕事 B に、\(B_j\) が最小の人 \(j\) を使うことを考えます。 これが可能ならば、最適性は明らかで、答は \(\max(A_i, B_j)\) です。
以下、そうでないとします。つまり \(i = j\) です。
最適解において、この人をどちらかの仕事には使うとしてよいです(そうでない割り当て \((A_k, B_l)\) が最適解だったとすると、\((A_k,B_i)\) も最適解です)。この人 \(i\) の様子で場合分けして、以下の \(3\) 種の値の最小値が答となります。
- 両方に人 \(i\) を使う場合のスコア:\(A_i + B_i\)
- 仕事 \(A\) のみ人 \(i\) を使う場合のスコア:\(\max(A_i, \min\{B_j\mid i\neq j\})\)
- 仕事 \(B\) のみ人 \(i\) を使う場合のスコア:\(\max(B_i, \min\{A_j\mid i\neq j\})\)
これをそのまま実装すると、時間計算量 \(O(N)\) にできると思います。
posted:
last update: