我们要解决的是 (dfrac{sumlimits_{i=1}^n a_i imes x_i}{sumlimits_{i=1}^n b_i imes x_i}),其中 (x_i in {0, 1}),要求让上述式子最大值。
我们考虑转换问题,若 (exists L),满足 (sumlimits_{i=1}^n x_i imes(a_i - b_i imes L) geq 0),那么 (sumlimits_{i=1}^n x_i imes a_i geq sumlimits_{i=1}^n x_i imes b_i imes L),此时,(dfrac{sumlimits_{i=1}^n a_i imes x_i}{sumlimits_{i=1}^n b_i imes x_i}) 的最大值一定 (geq L),若 ( exists L),满足 (sumlimits_{i=1}^n x_i imes(a_i - b_i imes L) geq 0),那么 (sumlimits_{i=1}^n x_i imes a_i < sumlimits_{i=1}^n x_i imes b_i imes L),此时,(dfrac{sumlimits_{i=1}^n a_i imes x_i}{sumlimits_{i=1}^n b_i imes x_i}) 的最大值一定 (< L),我们发现这个 (L) 是满足单调性的,于是我们可以二分这个 (L)。
现在问题就变为了如何判定是否存在 (x_i) 满足 (sumlimits_{i=1}^n x_i imes(a_i - b_i imes L) geq 0),这个很简单,当 (a_i - b_i imes L > 0) 时,我们便让 (x_i = 1),否则 (x_i = 0)。
于是这个问题就在 (O(n log max{L})) 解决了。
若限制 (x_i) 为 (1) 的个数为 (k) 个,我们只需在 check 时求出所有的 (a_i - b_i imes L),然后从大到小排序一遍,选取前 (k) 个,判断是否 (geq 0) 即可。