二分搜索法通常用来在有序数组中快速查找某值,但它的作用不仅仅就是这样,其在求最优解的问题上也非常有用。
让我们考虑一下“求满足某个条件C(x)最小的x”这一问题。对于任意满足C(x)的x,如果所有的x’ >= x 也满足C(x’)的话,我们就可以用二分搜索来球的最小的x。
首先将区间左端点初始化为不满足C(x)的值,右端点初始化为满足C(x)的值,每次取mid=(L+R)/2,判断C (mid)是否满足并缩小范围,知道(L,R)足够小,最后的R就是所求值。
何时可以使用二分法计算答案?
1、根据候选答案的范围来判断,候选答案必须是离散的,而且已知答案的范围是[最小值min,最大值max]。
2、容易判断某个点是否为答案(即在二分过程中,mid指向的点是否为答案)
3、候选答案在区间上必须按照某种条件一类一类的排列,即:小于某个值的答案一定满足C(x),大于某个值的答案不满足C(x),在这种情况下才能根据此属性进行二分操作。
例题:
1.给定长度为n的单调不下降数列a和一个数k,求数列中不小于k的数的最小下标,不存在的情况下输出n
2.poj 1064
3.poj 2456