2019年7月3日水曜日

ARC 031 D - 買い物上手

ARC 031 D - 買い物上手

得られた経験値/使ったお金の最大値を二分探索で探す。

買うアイテムを表すベクトルをx{0,1}Mx \in \{0, 1\}^Mとする。λ>0\lambda > 0が与えられたとき、得られた経験値/使ったお金がλ\lambda以上であることは

S1x(A1,1)x(A1,2)...x(A1,k1)+...+SNx(AN,1)x(AN,2)...x(AN,kN)T1x(1)+...+TMx(M)λ\frac{S_1x(A_{1,1}) x(A_{1,2})... x(A_{1,k_1}) + ... + S_Nx(A_{N,1})x(A_{N,2})... x(A_{N,k_N})}{T_1x(1) + ... + T_Mx(M)} \ge \lambda

と表され、これはx0x \neq 0という条件下では

λT1x(1)...λTMx(M)+S1x(A1,1)x(A1,2)...x(A1,k1)+...+SNx(AN,1)x(AN,2)...x(AN,kN)0-\lambda T_1x(1)- ... -\lambda T_Mx(M) \\ + S_1x(A_{1,1}) x(A_{1,2})... x(A_{1,k_1}) + ... + S_Nx(A_{N,1})x(A_{N,2})...x(A_{N,k_N}) \ge 0

と同値である。したがって、大ざっぱに言えば、左辺が00以上になるような最大のλ\lambdaを二分探索で求めればよい。

(ただ、後者の不等式はx=0x = 0、つまりアイテムをひとつも買わないケースで常に成立してしまうため、これを除かなければならない。x=0x=0 の場合に不等式が成り立たないようにするためには、double floatの計算誤差よりは大きいが問題の許容誤差よりは小さい数ϵ\epsilon(たとえば10710^{-7})を設定して

λT1x(1)...λTMx(M)+S1x(A1,1)x(A1,2)...x(A1,k1)+...+SNx(AN,1)x(AN,2)...x(AN,kN)ϵ-\lambda T_1x(1)- ... -\lambda T_Mx(M) \\ + S_1x(A_{1,1}) x(A_{1,2})... x(A_{1,k_1}) + ... + S_Nx(A_{N,1})x(A_{N,2})...x(A_{N,k_N}) \ge \epsilon

とすればよい。)

さて、λ\lambdaを決めた時に左辺の最小値は最小カットで求まる。以下はyosupoさんのフレームワークにしたがって考える。

λTix(i)- \lambda T_i x(i)は次のように解釈する:

  • αi\alpha_iを選ぶとλTi\lambda T_i円の罰金がかかるが、物αi\alpha_iを選ばなければ罰金なしである。

また、項Sjx(Aj,1)x(Aj,2)...x(Aj,kj)S_j x(A_{j, 1})x(A_{j,2})... x(A_{j,k_j})は次のように解釈する:

  • 無条件でSjS_j円手に入る。
  • βj\beta_jを選ばなければSjS_j円の罰金がかかる。
  • βj\beta_jを選んだのに品物αAj,1\alpha_{A_{j, 1}}を選ばなかったら++\infty円の罰金がかかる。物βj\beta_jを選んだのに物αAj,2\alpha_{A_{j, 2}}を選ばなかったら++\infty円の罰金がかかる。……

これらの条件に対応したネットワークを作って最大流を求めると、最小カットの容量ccも求まる。Sjc\sum S_j - cが上の不等式の左辺の最小値である。

サンプル1を例にとってグラフを与える:

3 4
4 3 2
4 2 1 10
2 1 2
2 1 3
3 2 3 4

Sample 1

drkenさんのリストにProject Selection Problemの例題として挙がっていたので、そう言われればまあ……という感じだった。

Project Selection Problemについて