二分答案
二分答案
使用条件(最大的最小,最小的最大)
-
命题可以被归纳为找到使得某命题\(P(x)\)成立(或不成立)的最大(或最小)的\(x\)。
-
把\(P(x)\)看作一个值为真或假的函数,那么它一定在某个分界线的一侧全为真,另一侧全为假。
-
可以找到一个复杂度优秀的算法来检验\(P(x)\)的真假。
好理解的板子
整数二分
int Find(int L, int R)
{
int ans, mid;
while (L <= R)
{
int mid = L + ((R - L) >> 1);
if (check(mid))
{
ans = mid;
R = mid - 1;//L = mid + 1;
} else {
L = mid + 1;//R = mid - 1;
}
}
return ans;
}
小数二分
#define eps 1e-6
while(rbound-lbound>eps){
double mid=(l+r)/2;
if(check(mid)){
l=mid;
}else{
r=mid;
}
}
好题
P1024 NOIP2001 提高组 一元三次方程求解
(浮点数的二分)
while(l <= r)
{
db mid = (l + r) / 2;
if (check(mid) * check(r) <= 0)
{
l = mid;
} else {
r = mid;
}
}
错!因为浮点数存在误差。不能直接比较是否相等,而是判断差值是否小于eps
#define eps 1e-4
while(r - l >= eps)
{
db mid = (l + r) / 2;
if (check(mid) * check(r) <= 0)
{
l = mid;
} else {
r = mid;
}
}
正确