二分算法模版

news2024/9/27 2:53:00

二分算法模版

  • 实数二分算法模版
    • 实数二分模版题
  • 整数二分算法模版
    • 向上取整二分模版
    • 向下取整二分模版
    • 二分模版的注意点
      • 二分模版中check函数的实现
      • 能够使用二分的条件

二分主要分两类,
一类是对实数进行二分,一类是对整数进行二分
对整数二分又分成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函数都是不一样的,这只有靠自己做题,多积累,多体会和总结

能够使用二分的条件

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1414733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu20.04 安装ROS2 记录

主要参考B站古月居的ROS2入门21讲 和 以下链接&#xff08;基本和视频上一致&#xff09; ubuntu20.04安装ROS2 详细教程_ubuntu20.04 ros2-CSDN博客 但是中间有些需要注意的地方&#xff0c; 1&#xff0c;添加源 步骤中提到 sudo curl -sSL https://raw.githubuserconten…

移动Web——平面转换-旋转

1、平面转换-旋转 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style…

【JavaEE进阶】 数据库连接池与MySQL企业开发规范

文章目录 🌴数据库连接池🎋数据库连接池的使用🎄MySQL企业开发规范⭕总结🌴数据库连接池 数据库连接池负责分配、管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个. 没有使⽤数据库连接池的情况:每次执⾏SQL语句,要先创建⼀…

【JavaSE篇】——数组的定义与使用

目录 本章的目标&#xff1a; &#x1f388;数组的基本概念 &#x1f36d;创建数组 &#x1f36d;数组的初始化 &#x1f36d;数组的使用 &#x1f449;数组中元素访问 &#x1f449;遍历数组 &#x1f388;数组是引用类型 &#x1f36d;初始JVM的内存分布 &#x1f…

HarmonyOS自定义弹出对话框CustomDialog并传递变量

HarmonyOS定义了一系列弹窗反馈类的组件​ 和前端开发框架VUE3配套生态库element plus中的提供各种组件相比&#xff0c;还是要少一些。可能是手机端操作和PC端操作的差异导致的​ 如果内置的弹窗不满足要求&#xff0c;可以基于CustomDialog自定义出各种个性化的反馈组件。 首…

数据库:根据学校的业务规则画出E-R图以及数据库模型图,并构建一个简单的数据库

目录 序言 一、需求 二、E-R图 E-R图&#xff1a; 三、关系模式 数据库模型图&#xff1a; 四、在MYSQL中创建数据库 4.1 年级表的创建 4.2 科目表的创建 4.3 学生表的创建 4.4 成绩表的创建 结果如下&#xff1a; 序言 本篇文章我将通过一个具体的例子教会大家大家…

Ceph分布式存储自动化运维平台开发实践

文章目录 1. 背景介绍1.1 什么是Ceph&#xff1f;1.1.1 Ceph的核心组件1.1.2 Ceph的优势 1.2 自动化运维的需求目标 2. 平台架构设计和组件版本2.1 平台架构设计2.2 组件版本2.3 模块划分&#xff08;已经脱敏处理&#xff09;2.3.1 当前版本V1.0支持功能2.3.2 前后端代码结构t…

vivado 定义和配置I/O端口、

定义和配置I/O端口 您可以使用Vivado IDE导入、创建和配置I/O端口&#xff0c;如中所述以下部分。 导入I/O端口 根据项目类型&#xff0c;可以使用以下方法导入I/O端口&#xff1a; •I/O规划项目&#xff1a;您可以将XDC和CSV文件导入空的I/O规划项目当您使用文件导入功能…

Jmeter实现造10个账户、单元数据

今天简单介绍Jemeter的入门,Jmeter 的安装这边就跳过,直接讲述如何使用JMETER,如何运用Jmeter进行测试。Jmeter实现造10个账户、单元数据,之后大数据量批量造数据以此类推。 1.下载jmeter软件 2.安装jmeter软件 3.运行\bin\jmeter.bat批处理文件 4.选择脚本文件 5.…

全局视角,搞懂“新零售支付”

文章首发于微信公众号:PenguinPay &#xff0c;欢迎关注。 零售业就是商家将商品或服务在场所中卖给消费者。其中的关键词就是 人&#xff0c;货&#xff0c;场。 一、 初始新零售 1.1 传统零售货找人 传统零售业,只能在固定场所销售商品或服务&#xff0c;以商家店为中心只…

缓存技术—redis

一、redis介绍 1.什么是NoSQL NosQL (Not-Only:sQL)&#xff0c;泛指非关系型的数据库(关系型数据库: 以二维表形式存储数据) 非关系型的数据库现在成了一个极其热门的新领域&#xff0c;发展非常迅速。而传统的关系数据库在应付超大规模和高并发的网站已经显得力不从…

pip安装镜像源设置

01.官方镜像源&#xff1a;资料最新&#xff0c;包最全 https://pypi.python.org/simple 02.国内镜像源&#xff1a;国内访问速度快 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 03. 配置方式1&#xff1a;永久替换 pi…

Spark运行架构以及容错机制

Spark运行架构以及容错机制 1. Spark的角色区分1.1 Driver1.2 Excuter 2. Spark-Cluster模式的任务提交流程2.1 Spark On Yarn的任务提交流程2.1.1 yarn相关概念2.1.2 任务提交流程 2.2 Spark On K8S的任务提交流程2.2.1 k8s相关概念2.2.2 任务提交流程 3. Spark-Cluster模式的…

2024最新版Visual Studio Code安装使用指南

2024最新版Visual Studio Code安装使用指南 Installation and Usage Guide for the Latest Visual Studio Code in 2024 By JacksonML Visual Studio Code最新版1.85已经于2023年11月由其官网 https://code.visualstudio.com正式发布&#xff0c;这是微软公司2024年发行的的最…

《WebKit 技术内幕》学习之十五(5):Web前端的未来

5 Crosswalk项目 Crosswalk项目是由英特尔公司发起的一个开源项目&#xff0c;该项目基于WebKit&#xff08;Blink&#xff09;和Chromium等开源项目打造&#xff0c;其目的是提供一个跨不同操作系统的Web运行环境&#xff0c;包括Android、Tizen、Linux、Windows、MacOS等众多…

Linux-----Shell编程之循环语句

目录 一、小命令 1、echo 实验&#xff1a; 2、date ------ 查看当前系统时间 3、cal ---- 日历 4、seq 打印 二、循环语句 1、for语句 实验&#xff1a; 计算整数和&#xff1a; 列出奇偶数 批量添加、删除用户 密码验证 随机抽奖 改名 九九乘法表 九九乘…

线性表--栈

1.什么是栈&#xff1f; 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除 操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/入栈&#xff…

AI大模型开发架构设计(5)——人人能学会的Llama-2大模型微调

文章目录 人人能学会的Llama-2大模型微调1 什么是Llama-2以及关键特性分析什么是Llama-2?Llama-2关键特性分析2 Llama-2微调全流程剖析为什么要微调Llama-2?Llama-2微调全流程3 基于Llama-2微调3个应用案例案例1:电子游戏评价数据生成文本数据集合案例2:利用Llama-2微调模型…

linux 查看zookeeper server运行版本号

zookeeper版本查看运行命令&#xff1a;echo stat|nc localhost 2181 显示如下图所示&#xff1a; Zookeeper version: 3.4.5-cdh6.3.2--1, built on 11/08/2019 13:15 GMT Clients: /127.0.0.1:44814[0](queued0,recved1,sent0) Latency min/avg/max: 0/0/0 Received: 9 Se…

【Linux】开始使用 vim 吧!!!

Linux 1 what is vim &#xff1f;2 vim基本概念3 vim的基本操作 &#xff01;3.1 vim的快捷方式3.1.1 复制与粘贴3.1.2 撤销与剪切3.1.3 字符操作 3.2 vim的光标操作3.3 vim的文件操作 总结Thanks♪(&#xff65;ω&#xff65;)&#xff89;感谢阅读下一篇文章见&#xff01;…