二分

二分答案

二分模板:
模板1.

	while (l < r)
    {
        int mid = l + r >> 1;	//(l+r)/2
        if (check(mid))  r = mid;    // check()判断mid是否满足性质
        else l = mid + 1;
    }

模板2.

	while (l < r)
    {
        int mid = l + r + 1 >> 1;	//(l+r+1)/2
        if (check(mid))  l = mid;
        else r = mid - 1;
    }

浮点二分模板:

	while(r-l>1e-5) //需要一个精度保证
	{
		double mid = (l+r)/2;
		if(check(mid)) l=mid; //或r=mid;
		else r=mid; //或l=mid;
	}

二分查找:在一个已知的有序数据集中进行查找。
二分答案:答案有一个最优区间,在这个区间二分查找一个最优答案。

如何判断题目是不是用二分答案?

1、答案在一个区间内(一般情况下,区间会很大,暴力超时)
2、直接搜索不好搜,但是容易判断一个答案可行不可行
3、该区间对题目具有单调性,即:在区间中的值越大或越小,题目中的某个量对应增加或减少。

此外,可能还会有一个典型的特征:求...最大值的最小,求...最小值的最大。
1、求...最大值的最小
求...最大值的最小,我们二分答案(即二分最大值)的时候,判断条件满足后,尽量让答案往前来(即:让r=mid),对应模板1;
2、求...最小值的最大
求...最小值的最大时,我们二分答案(即二分最小值)的时候,判断条件满足后,尽量让答案往后走(即:让l=mid),对应模板2;

最大值最小,最小值最大 类 问题解题方向:

最短距离最大化问题:保证任意区间距离要比最短距离mid大或相等(这样,mid才是最短距离)即:区间的距离>=mid
最长距离最小化问题:保证任意区间距离要比最大距离mid小或相等(这样,mid才是最大距离)即:区间的距离<=mid

例题:

二分查找

A-B数对
烦恼的高考志愿
银行贷款

二分答案

木材加工
跳石头
数列分段 Section II
路标设置

posted @ 2022-01-24 16:09  snaliuu  阅读(162)  评论(0)    收藏  举报