平均値を最大化するような実数の対を選ぶ問題
問題設定
n個の正の実数の対 ()と,n以下の自然数kが与えられる.
この中からk個の対 ()を選び,
…(*)
を最大化したい.
どのように対を選べば良いだろうか.
解法
(*)式を変形して次のようにする.
ここで,総和における各要素に着目し,Tを変数とみなしてとおく.すると(*)は
…(**)
と変形される.
Tにはある値が選ばれているとする.(**)が成り立つようなを選ぶ方法を考える.
Tを固定した場合において(**)の左辺を最大化するには,を大きい順にソートして大きいものから順にk個取ればよい.これをとおく.
であるとき,(**)を成り立たせるには
- 1. の中から適当なものをk個選びなおす
- 2. Tの値を増加させてを減少させる
の2通りがあるが,この問題ではTの値を最大化するのが目的なので2.の手段をとる.
また,であるときは対をどう取っても(**)の左辺は負になるので,Tの値を減少させるほかない.
上記の方法でTの値で2分探索を行えば,最大値が得られる.
計算量
2分探索において初期値は下限を0,上限をに取ればよいので2分探索は回行われる.
ソートのオーダーはなので,全体の計算量はとなる.