二分法总结

二分法总结

一、二分法的适用范围

二 分 法 是 适 用 于 解 决 具 有 “ 二 段 性 ” ( 单 调 性 ) 的 问 题 的 方 法 , 通 常 表 现 为 求 解 满 足 某 一 条 件 的 最 大 值 或 者 最 小 值 问 题 。 二分法是适用于解决具有“二段性”(单调性)的问题的方法,通常表现为求解满足某一条件的最大值或者最小值问题。 ()

二 段 性 : 对 某 一 范 围 内 的 数 据 , 存 在 一 个 临 界 点 , 使 得 临 界 点 某 一 侧 的 所 有 数 据 都 满 足 某 一 性 质 , 另 一 侧 的 所 有 数 据 都 不 满 足 这 一 性 质 , 就 称 这 一 范 围 内 的 数 据 具 有 二 段 性 。 例 如 , 对 函 数 y = x − 1 , 当 x ∈ R 时 , 在 x > = 1 时 , y > = 0 , 并 且 在 x < 1 时 , y < 0 。 由 此 可 见 具 有 单 调 性 的 问 题 也 具 有 二 段 性 。 二段性:对某一范围内的数据,存在一个临界点,使得临界点某一侧的所有数据都满足某一性质,\\另一侧的所有数据都不满足这一性质,\\就称这一范围内的数据具有二段性。 例如,对函数y=x-1,当x∈R时,在x>=1时,y>=0,并且在x<1时,y<0。由此可见具有单调性的问题也具有二段性。 使y=x1,xRx>=1y>=0x<1y<0

一 般 地 , 具 有 单 调 性 的 问 题 都 是 可 以 二 分 的 , 不 具 有 单 调 性 的 问 题 也 可 能 可 以 使 用 二 分 。 一般地,具有单调性的问题都是可以二分的,不具有单调性的问题也可能可以使用二分。 使

二、使用二分法的解题步骤

  1. 根 据 数 据 范 围 确 定 答 案 所 在 的 区 间 [ L , R ] 。 根据数据范围确定答案所在的区间[L,R]。 [L,R]
  2. 根 据 题 意 确 定 二 分 法 的 判 断 条 件 , 使 得 该 判 断 条 件 具 有 二 段 性 , 通 常 是 " > " 或 " < " , 且 答 案 是 该 二 段 性 的 分 界 点 。 根据题意确定二分法的判断条件,使得该判断条件具有二段性,通常是">"或"<",且答案是该二段性的分界点。 使">""<"
  3. 判 断 L 和 R 的 中 点 M 是 否 满 足 判 断 条 件 , 并 不 断 更 新 区 间 端 点 L 和 R , 直 到 L = R 。 判断L和R的中点M是否满足判断条件,并不断更新区间端点L和R,直到L=R。 LRMLRL=R
  4. 对 整 数 二 分 而 言 , 若 更 新 时 写 的 L = M , 则 计 算 M 时 要 加 1 , M = ( L + R + 1 ) / 2 。 因 为 若 L = 0 , R = 1 , 由 于 整 数 除 法 默 认 向 下 取 整 的 缘 故 , M = ( L + R ) / 2 = 0 , 那 么 L = M 会 始 终 赋 值 为 0 , 程 序 陷 入 死 循 环 。 对整数二分而言,若更新时写的L=M,则计算M时要加1,M=(L+R+1)/2。因为若L=0,R=1,由于整数除法默认向下取整的缘故,M=(L+R)/2=0,那么L=M会始终赋值为0,程序陷入死循环。 L=MM1M=(L+R+1)/2L=0R=1M=(L+R)/2=0L=M0

三、二分法的模板写法分类

一、整数二分

①、 i f ( 判 断 条 件 )   L = M , 那 么 更 新 M 时 , M = ( L + R + 1 ) / 2 if(判断条件) \ L=M,那么更新M时,M=(L+R+1)/2 if() L=MMM=(L+R+1)/2

------题目链接:蓝桥杯—分巧克力

②、 i f ( 判 断 条 件 )   R = M , 那 么 更 新 M 时 , M = ( L + R ) / 2 if(判断条件) \ R=M,那么更新M时,M=(L+R)/2 if() R=MMM=(L+R)/2

------题目链接:头条笔试—机器人跳跃问题

二、浮点数二分

正 常 写 , 不 用 考 虑 死 循 环 问 题 。 正常写,不用考虑死循环问题。

题目:
给定一个浮点数n,求它的三次方根。

输入格式
共一行,包含一个浮点数n。

输出格式
共一行,包含一个浮点数,表示问题的解。

注意,结果保留6位小数。

数据范围
−10000≤n≤10000
输入样例:
1000.00
输出样例:
10.000000

代码:

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
    double n;
    cin>>n;
    double l=-10000,r=10000,mid;
    while(r-l>1e-8)
    {
        mid=(l+r)/2;
        if(mid*mid*mid>=n) r=mid;
        else l=mid;
    }
    
    printf("%lf\n",mid);
    
    return 0;
    
}
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值