二分算法模版

二分主要分两类,
一类是对实数进行二分,一类是对整数进行二分
对整数二分又分成2种,一种是向上取整的二分模版,一种是向下取整的二分模版

实数二分算法模版

//这里区间范围为
double l = 0 ,r = n;
    
    // 这里循环条件根据题意来,保留几位小数
    //如果题目要求保留6位小数,保险一点,再加2位,
    //循环条件就是保留8位小数   --->(r - l)
    while(r - l > 1e-8)  //r - l 
    {
   
        double mid = (r + l) / 2;
        
        if(check(mid))
            r = mid; //范围大了,缩小范围
        else 
            l = mid;  //范围小了扩大范围
    }
    

注意:浮点数二分相当于连续的,要加或者减一个很小的数, +1, -1 误差很大,所以都后面执行语句直接等于mid
区别于实数二分

实数二分模版题

在这里插入图片描述

#include<iostream>
#include<cstdio>

using namespace std;

int main()
{
   
    double x;
    scanf("%lf", &x);
    
    double l = -10000 ,r = 10000;
    
    while(r - l > 1e-8)  //r - l 大于8位小数 (题目要求六位,这里取八位,保险一点)
    {
   
        double mid = (r + l) / 2;
        
        if(mid * mid * mid >= x)
            r = mid; //范围大了,缩小范围
        else 
            l = mid;  //范围小了扩大范围
    }
    
    printf("%.6lf", l);
    
    return 0;
}

整数二分算法模版

向上取整二分模版

一般,可用来求最小值中的最大值或者最大值

// 每次注意找出二分的范围
//向上取整的区间为 [l, mid - 1]  [mid, r]

int l = 0, r = n;
while(l < r)
{
   
	int mid = l + r + 1 >> 1;
 	if(check(mid)) //mid数据合法,扩大范围,看看有没有更大的
 		l = mid; 
 	else //mid数据不合法,缩小范围
 		r = mid - 1
}

//结束循环的条件 l == r

当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。

向下取整二分模版

一般,可用来求最大值中的最小值或者最小值


//向下取整的区间范围
//[l, mid] [mid + 1, r]

int l = 0, r = n;
while(l < r)
{
   
	int mid = l + r >> 1;
	
	if(check(mid)) //mid数据合法 缩小区间看看有没有更小的
		r = mid;
	else     //mid数据不合法,扩大区间   
		l = mid + 1; 
}

当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1

二分模版的注意点

二分模版有很多,选择自己适合的背就行

这个整数二分的注意点
1.循环条件都是 while(l < r) 都没有取等
2.向上取整的算法模版中 mid 还有多加1, 不加1的话会陷入死循环
3.二分使用的时候,是对一个有序的区间进行二分,如果这个区间无序,要对这个区间=进行排序

二分模版中check函数的实现

.check()函数的实现
check()函数,是二分模版中,最难的一部分。
作用就是判断二分的数据是否合法,满足题意
或者是找具有二段性的临界的判断条件
不同题的check函数都是不一样的,这只有靠自己做题,多积累,多体会和总结

能够使用二分的条件

能够使用二分解决问题,一般是具有单调性或者是二分性,或者是求一个区间的最大值或者最小值等

相关推荐

  1. 二分算法

    2024-01-27 22:46:03       61 阅读
  2. 二分算法

    2024-01-27 22:46:03       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-27 22:46:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-27 22:46:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-27 22:46:03       82 阅读
  4. Python语言-面向对象

    2024-01-27 22:46:03       91 阅读

热门阅读

  1. cs2系统提升思路

    2024-01-27 22:46:03       62 阅读
  2. 从k8s当中学习go cli脚手架开发利器-cobra

    2024-01-27 22:46:03       46 阅读
  3. 一篇文章带你全面理解热更新技术

    2024-01-27 22:46:03       45 阅读
  4. Golang 垃圾回收

    2024-01-27 22:46:03       57 阅读
  5. js如何数组去重

    2024-01-27 22:46:03       62 阅读
  6. 抖音私信风车怎么做,详细的实现过程,附视频

    2024-01-27 22:46:03       59 阅读
  7. Vue3使用百度地图marker点位实现水波纹动效

    2024-01-27 22:46:03       49 阅读
  8. 深入了解 Spring ImportBeanDefinitionRegistrar

    2024-01-27 22:46:03       50 阅读
  9. ‘HEAD‘ 是 HTTP 请求的一种方法

    2024-01-27 22:46:03       47 阅读
  10. vue2中的$nextTick原理和简单实现

    2024-01-27 22:46:03       49 阅读