二分答案

二分答案

使用条件(最大的最小,最小的最大)

  1. 命题可以被归纳为找到使得某命题\(P(x)\)成立(或不成立)的最大(或最小)的\(x\)

  2. \(P(x)\)看作一个值为真或假的函数,那么它一定在某个分界线的一侧全为真,另一侧全为假。

  3. 可以找到一个复杂度优秀的算法来检验\(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;
	}
}

正确

P2678 跳石头

巧妙地从题目中转化check条件

P1182 数列分段

对左右区间的特别处理

posted @ 2023-10-25 17:54  加固文明幻景  阅读(16)  评论(0编辑  收藏  举报