平均最大化
二分探索 を使って、平均最大化問題 を解いてみます。
問題
重さと価値がわかっている品物が複数あります。 この中から、k個選んだ時の重さあたりの価値の最大値を求めてください。
ソースコード
この問題は 重さあたりの価値がx以上となるように選ぶことができるかどうか という関数を定義し、二分探索で最大のxを求める ことで解くことができます。
関数としては、それぞれの品物に対して(価値 - 重さあたりの価値[x] × 重さ)を計算し、この結果の大きいほうからk個の和を求めて、それが0以上かどうかで判定します。
[Google Colaboratory]
1 | #------ 入力例 ------ |
[実行結果]
解: 0.75
解は 0.75 となりました。
品物の価値と重さを確認すると、1つめと3つめの品物を選んで重さあたりの価値を計算すると (2 + 1) / (2 + 2) = 0.75 となり 最大値 となっていることが確認できます。