二分查找,二分答案

本文详细介绍了二分查找在最大化最小值和最小化最大值问题中的应用。通过实例展示了如何利用二分法解决浮点数区间的问题,并讨论了如何处理最短距离最大化和最长距离最小化问题。此外,还特别提到了浮点数二分查找时的精度控制技巧。
摘要由CSDN通过智能技术生成

二分法

在这里插入图片描述

二分查找

include <algorithm>
binary_search(a,a+n,value) 在递增序列中查找,找到返回true ,false
lower_bound(a,a+n,value) 返回大于等于value的值
lower_bound(a,a+n,value,greater<T>()) 返回小于等于的值
upper_bound(a,a+n,value) 返回大于value的值
upper_bound(a,a+n,value,greater<T>()) 返回小于value的值

二分查值

1. 最大化最小值
区间[l, r]划分成[l, mid - 1]和[mid, r]
整数:

while(l<r){//最大化最小值
    int mid = (l + r + 1) >> 1;
    if(check())//当取这个mid时,能够满足条件,咋们找满足条件的最大值,则往右边搜索
        l = mid;//答案在右边,往右边搜索
    else
        r = mid - 1;
}

浮点数:

while(r-l>0.00001)//最大化最小值
{//保留4位小数
    double mid = (r + l+0.00001) / 2;//可以写2.0000
    if(check(mid))
        l = mid;
    else
        r = mid;// - 0.00001保留精确度
}
cout << l << endl;

2. 最小化最大值
将区间[l, r]划分成[l, mid]和[mid + 1, r]

while (l<r){//最小化最大值
    int mid =(l+r)>>1;
    if(check())//当取这个mid时,能够满足条件,咋们找满足条件的最小值,则往左边搜索
        r = mid;//答案在左边,往左边搜索
    else
        l = mid + 1;
}

浮点数:

while(r-l>0.000001)//最小化最大值
{
    double mid = (r + l) / 2;//+ 2.0000
    if(check(mid))
        r = mid;
    else
        l = mid;//+ 0.000001
}
cout << l << endl;

浮点数可以通过循环100次来减小误差

for(int i=0;i<100;++i){
    double mid = (r+l) >> 1;
    if(check(mid)) r=mid;
    else l=mid;
}
cout<< l << endl;

最短距离最大化问题:指的是每一个区间都有最小值,求每个区间最小值的最大值 保证任意区间距离要比最短距离mid大或相等(这样,mid才是最短距离)即:区间的距离>=mid mid逐渐增加直到不满足条件,则是每个区间最小值的最大值
最长距离最小化问题:指的是每一个区间都有最大值,求每个区间最大值的最小值 保证任意区间距离要比最大距离mid小或相等(这样,mid才是最大距离)即:区间的距离<=mid mid逐渐减少直到不满足条件,则是每个区间最大值的最小值
浮点数二分:
如果保留n位小数,while条件写 r - l > 1e-(n+2)
二分答案时,mid就是满足题意的值,可以依次对题目的条件进行判断,书写函数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值