题目大意
给出nnn个元素,每个元素有两个属性wi,viw_i,v_iwi ,vi ,分别代表增加减少的闸值和增减数量。
你可以选定一个数字SSS作为每一个元素的闸值,假如S>=wiS>= w_iS>=wi ,那么你将获得viv_ivi 点价值,否则减少viv_ivi 价值。
求出总价值sumv>=Msum_v >= Msumv >=M的最小SSS取值。
思路分析
找单调性,很快可以发现SSS是与SumvSum_vSumv 成正比关系的,SSS的数值越大,那么SumvSum_vSumv 的数值也会相应的变大。
那么就可以针对于SSS来进行二分,使得Sumv>=MSum_v >= MSumv >=M的同时,让SSS的数值尽可能地小,针对于SSS的区间来进行不停进行范围的枚举,直到满足要求为止。
可能会出现两种情况
1. S−>Sumv<MS -> Sum_v < MS−>Sumv <M :此时说明SSS的数值不足以达到目标,让SSS变大即可。
2. S−>Sumv>=MS -> Sum_v >= MS−>Sumv >=M : 此时说明SSS的数值已经达到目标,但是不一定是最小值,可能是之一,那么保存S继续缩短范围。
总计两步
1. 使用二分得出合理的SSS ,时间复杂度为Log(n)Log(n)Log(n)
2. 使用枚举遍历nnn求得SumvSum_vSumv ,时间复杂度为O(n)O(n )O(n)
时间复杂度分析
O(nlog(n))O(nlog(n))O(nlog(n))
代码示范