题意:类似于GPA求解的过程,给定两个规模为N的数组A,B,其中A的数小于等于相同位置上B的数,请选择k个位置,使A中数的和除以B中数的和达到最大。
题解:类似于背包,每个位置有0,1两种选择。
- 设N维列向量X,其中只包含0,1两种元素。则A*X就等于分子的和,B*X就相等于与分母的和。
- 设相除的结果为L,即L = (A*X)/(B*X)。
- 我们设一关于L的函数,Z = A*X-(B*X)*L,其中X只含有k个1,且在给定L的情况下使Z值最大,可以通过排序求得Z值(易知X向量是可能随L变化的)。注意Z是一个关于L的分段线性的凹函数。
一、二分法
- 二分法的一般步骤就是首先给出所求值的大致范围,然后根据单调性逐渐缩小这个范围达到所需的精度。
- 设最大的比值为L_max,即