(acwing蓝桥杯c++AB组)2.1 二分

二分与前缀和

二分

难点:二分的边界问题

整数二分核心思想

  1. 确定一个区间,使得目标值一定在区间中。

  2. 找一个性质满足:(对于百分之95的二分拥有这个性质)

    • 性质具有二段性。
    • 答案是二段性的分界点。

整数二分模板

对于整数二分我们分为两类
有的小伙伴就要问了:为什么是分成2类而不是1类3类呢?
答:我们来看这么一种情况
对于一组序列如下:要求找到值为5的第一个数和最后一个数,返回对应下标。

34555810
数组下标0123456

不难发现我们需要两个模板,使得一个板子二分结果为2,一个板子二分结果为4。

image-20211110000409923

image-20211110225717046
代码如下:

bool check(int x) {/* ... */} // 检查x是否满足某种性质

// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;    // check()判断mid是否满足性质
        else l = mid + 1;
    }
    return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

整数二分步骤总结:

  1. 找一个区间[L,R],使得答案一定在该区间中。
  2. 找一个判断条件,使得该判断条件具有二段性,并且答案一定是该二段性的分界点。
  3. 分析终点M在在该判断条件下是否成立,如果成立,考虑答案在哪个区间。
  4. 如果更新方式写的是R=Mid,则不用做任何处理;如果更新方式写的是L=Mid,则需要再计算Mid时加上1。
题目链接

789. 数的范围 - AcWing题库

下面是本节课总的题单,涉及前缀和等可以先不看跳过。

image-20211111214237772

实数二分核心思想:

实数二分相对于整数比较简单,因为中点是基本可以取到的,没有整数一会加1,一会减去1这么绕。

image-20211112231555764

加一减一无需考虑,可以说是非常简单了(滑稽,第一遍写还是WA了)。只需注意浮点数精度丢失问题,取误差在1e-8即可。

题目链接

790. 数的三次方根 - AcWing题库

三分法思想:

用的不多,这里简单提一下。

对于下图的函数,我们为了找值可以采取对斜率二分(求导即可)。或者,采取下图的三分法,当重复多次后,l与r无线逼近即可。

image-20211112235128598

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只子美

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值