算法进阶——二分

二分法:

一种高效查找方法,将问题搜索范围一分为二,迭代地缩小范围,直到找到目标。

二分法适用于有序的数据集合。

常见的二分类型有:

整数二分

浮点二分

二分答案

二分解题步骤:

1.研究并发现数据结构的单调性

2.确定最大区间[l,r],确保分界点一定在里面

3.确定check函数,一般为传入的mid(区间中的某个下标),返回mid所属区域或返回一个值,当check函数较简单时可以直接判断。

4.计算中点mid=(l+r)/2,用check判断该移动l或r指针

5.返回l或r

模板代码:

int l=0,r = 1e9;
while (l+1!=r){int mid = (l+r)/2;if(a[mid]>=x)r= mid;elsel=mid;}cout<<r<<endl;    }

整数二分例题(lanqiao OJ 1389):

题目描述

给定一个数组,其采用如下代码定义:

int data[200];
for(i = 0 ; i < 200 ; i ++)data[i] = 4 * i + 6;

现给定某个数,请你求出它在 data 数组中的位置(下标)。

输入描述

输入一个待查找的整数(该整数一定在数组 data 中)。

输出描述

输出该整数在数组中的指标。

输入输出样例

示例 1

输入

262

输出

64

示例 2

输入

438

输出

108

示例 3

输入

774

输出

192
#include <bits/stdc++.h>
using namespace std;
int main(){int data[200];int n,left,right,mid;for(int i = 0 ; i < 200 ; i++){data[i] = 4 * i + 6;}cin >>n;left=0,right=199;while(left < right){mid=(left+right)/2;if(data[mid]>n){right=mid-1;}else if(data[mid]<n){left=mid;}else{cout<<mid<<endl;break;}}return 0;
}

浮点二分:

浮点二分模板:

double l =0, r = 1e9,eps =1e6-6;
while (r-l>=esp){//这里的esp为一个极小值doiuble mid = (l+r)/2;if(f(mid)>=0)r= mid;elsel =mid;}cout<<r<<endl;

二分答案:

二分答案模板:

bool check (int mid){bool res = ture;return res;
}
int main(){int l=0,r=1e9;while (l+1!=r){int mid = (l+r)/2;if(check(mid))l =mid;elser=mid;}cout<<l<<endl;return 0;
}

check函数根据题意写

二分答案例题(lanqiao OJ 364)可以去试一下(洛谷 OJ3853)

一年一度的"跳石头"比赛又要开始了!

这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 NN 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。

为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走MM 块岩石(不能移走起点和终点的岩石)。

输入描述

输入文件第一行包含三个整数 L,N,ML,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。

接下来 NN 行,每行一个整数,第 ii 行的整数 Di(0<Di<L)Di​(0<Di​<L)表示第 ii 块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。

其中,0≤M≤N≤5×104,1≤L≤1090≤M≤N≤5×104,1≤L≤109。

更新:数据于 2024 年 10 月 15 日进行了加强。

输出描述

输出只包含一个整数,即最短跳跃距离的最大值。

输入输出样例

示例

输入

25 5 2
2
11
14
17
21

输出

4
#include<bits/stdc++.h>
using namespace std;
int l,n,m;
const int N = 5e4+10;
int a[N];
bool check(int mid){int pos = 0;int temp = m;for(int i = 1;i<=n+1;i++){if(temp<0) break;//最短跳跃距离尽可能长if(a[i]-pos<mid){temp--;//移走一个}else{pos = a[i];}}if(temp<0) return true;return false;
}
int main(){cin>>l>>n>>m;for(int i = 1;i<=n;i++){cin>>a[i];}a[n+1] = l;int L = 1,R = 1e9+10;while(L<R){int mid = (L+R+1)/2;if(check(mid)) R = mid - 1;else L = mid;}cout<<R<<endl;return 0;
}

例题二(lanqiao OJ 3683)

问题描述

肖恩有一大片农田,农田中有 NN 个可以种植苹果树的位置。这些位置都分布在一条直线上,坐标是 x1,x2,⋯,xNx1​,x2​,⋯,xN​ 。肖恩得到了 MM 个树苗,需要种到农田中的对应位置。

我们都知道两棵苹果树种的距离如果太近的话会互相争抢养分,导致两棵苹果树都会营养不良。所以肖恩认为相邻两棵苹果树之间的最近距离越大越好,那么请你帮肖恩算算最大的最近距离是多少?

输入描述

第一行输入两个整数 NN 和 MM ,两个数字的意义和题面中描述相同。

第二行输入 NN 个数字,第 ii 个数字 xixi​ 表示第 ii 个可以种植苹果树的位置。

数据保证 1≤N≤105,1≤M≤N,1≤xi≤1091≤N≤105,1≤M≤N,1≤xi​≤109 。

输出描述

输出一个数字表示最大的最近距离。

样例输入

5 3
1 3 4 8 9

样例输出

3

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m;
long long a[N];int check(long long mid)
{int res=1;//表示种树的数量 for(int i=2,ih=1;i<=n;i++){if(a[i]-a[ih]<mid)//如果<,说明距离不够种树,继续 {continue;}res++;//如果>=,说明可以种一棵树 ih=i;//ih跳到i,i++,继续 }return res;
}int main()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);long long first=0,last=a[n]+1;//从第一棵树到最后一棵树 while(first+1!=last){long long mid=first+(last-first)/2;if(check(mid)<m) last=mid;//如果检查出<,说明 种的树不够 ,说明距离太大需要向左移,所以将last=mid;else first=mid;//如果等于,继续右移,看看有没有更优 ,如果大于 ,说明距离太小,种的树多了,向右移动,增大距离,减小种树的数量 }cout<<first;//优解为first return 0;
}

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

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

相关文章

Kotlin函数式编程与Lambda表达式

Kotlin函数式编程与Lambda表达式 一、函数式编程基础 1.1 什么是函数式编程 函数式编程是一种编程范式&#xff0c;它将计算过程视为数学函数的求值&#xff0c;强调使用不可变数据和纯函数。在Kotlin中&#xff0c;函数式编程的特性让我们能够写出更简洁、更易维护的代码。…

Java 并行流(parallelStream)详解

目录 1. 什么是 parallelStream&#xff1f;2. parallelStream 的优势3. parallelStream 的使用3.1 基本使用3.2 计算总和示例3.3 结合groupingByConcurrent实现线程安全的分组操作 4. parallelStream 的注意事项4.1 适用场景4.2 并行流的局限性 5. 控制并行流线程数6. 总结 1.…

Ubuntu 20.04下配置VSCode以支持OpenCV库开发

Ubuntu 20.04下配置VSCode以支持OpenCV库开发 1. 安装OpenCV库安装OpenCV&#xff08;推荐使用APT安装&#xff09;或者从源码安装OpenCV&#xff08;可选&#xff09; 2. 安装VSCode的C扩展3. 配置c_cpp_properties.json4. 编写代码并测试5. 配置tasks.json&#xff08;编译Op…

io学习----->标准io

思维导图&#xff1a; 一.io的作用 io是实现对文件的操作&#xff0c;把运行结果存到文件中&#xff0c;读取文件的数据&#xff0c;方便后期查询。 二.io的概念 io是指系统 和外部设备或用户之间的数据交互 I:input 表示数据从外部设备输入到内存中&#xff1b; O:output…

使用消息队列怎样防止消息重复?

大家好&#xff0c;我是君哥。 使用消息队列时&#xff0c;我们经常会遇到一个可能对业务产生影响的问题&#xff0c;消息重复。在订单、扣款、对账等对幂等有要求的场景&#xff0c;消息重复的问题必须解决。 那怎样应对重复消息呢&#xff1f;今天来聊一聊这个话题。 1.三…

005 公网访问 docker rocketmq

文章目录 创建自定义网络创建NameServer容器创建Broker容器正式开始启动 Nameserver 容器启动 Broker 容器并关联 Nameserverdocker exec -it rmqbroker vi /etc/rocketmq/broker.conf检查 namesrv 解析检查 Broker 注册状态Nameserver 日志Broker 日志检查容器日志手动指定 Br…

解决Docker Desktop启动后Docker Engine stopped问题

一、问题描述 当我们更新了Docker Desktop后,在重新打开就显示【Docker Engine stopped(Docker引擎已经停止)】,无法正常使用Docker,如下图所示: 二、问题分析 1、检查电脑主板的CPU是否开启虚拟化; 2、需检查Docker所需的功能是否开启; 3、检查WSL是否匹配; Docker的…

MongoDB—(一主、一从、一仲裁)副本集搭建

MongoDB集群介绍&#xff1a; MongoDB 副本集是由多个MongoDB实例组成的集群&#xff0c;其中包含一个主节点&#xff08;Primary&#xff09;和多个从节点&#xff08;Secondary&#xff09;&#xff0c;用于提供数据冗余和高可用性。以下是搭建 MongoDB 副本集的详细步骤&am…

C++STL---<limits>

C <limits> 头文件&#xff1a; <limits> 头文件是 C 标准库中用于获取各种数据类型的数值范围、精度等信息的工具。它通过模板类 std::numeric_limits 提供了对基本数据类型&#xff08;如 int、float、double 等&#xff09;的详细属性查询功能。通过 std::nume…

蓝桥杯自我复习打卡

总复习&#xff0c;打卡1. 一。排序 1。选段排序 太可恶了&#xff0c;直接全排输出&#xff0c;一个测试点都没过。 AC 首先&#xff0c;这个【l,r】区间一定要包含p,或者q&#xff0c;pq一个都不包含的&#xff0c;[l,r]区间无论怎么变&#xff0c;都对ans没有影响。 其次&…

Flutter_学习记录_实现列表上拉加载更多的功能

可以用ScrollController组件来实现这样列表上拉加载更多的功能: 1. 定义变量 在StatefulWidget 的组件内&#xff0c;添加三个属性&#xff1a; // 滚动视图的控制器final ScrollController _scrollController ScrollController();// 是否已显示了上拉加载中bool _isShowM…

【Linux】【网络】不同子网下的客户端和服务器通信其它方式

【Linux】【网络】不同子网下的客户端和服务器通信其它方式 那么&#xff0c;在 NAT 环境下&#xff0c;应该如何让内网设备做为服务器&#xff0c;使内网设备被外部连接&#xff1f; 1 多拨 部分运营商&#xff0c;支持在多个设备上&#xff0c;通过 PPPoE 登录同一个宽带账…

《Python百练成仙》31-40章(不定时更新)

第卅一章 函数结丹def开紫府 罗酆山的鬼门关吞吐着猩红的变量阴风&#xff0c;每个风眼都涌动着作用域混乱的灵力乱流。叶军手握薛香遗留的丹田玉简&#xff0c;玉简表面浮现出残缺的函数符文&#xff1a; def 凝聚金丹(灵气):道基 灵气 * 0.618print(金丹品质) # 作用域外变…

六十天前端强化训练之第一天到第七天——综合案例:响应式个人博客项目

欢迎来到编程星辰海的博客讲解 目录 前言回顾 HTML5与CSS3基础 一、知识讲解 1. 项目架构设计&#xff08;语义化HTML&#xff09; 2. 响应式布局系统&#xff08;Flex Grid&#xff09; 3. 样式优先级与组件化设计 4. 完整响应式工作流 二、核心代码示例 完整HTML结…

测试的BUG分析

在了解BUG之前,我们要先了解软件测试的生命周期,因为大多数BUG都是在软件测试的过程中被发现的 软件测试的生命周期 在了解 软件测试的生命周期 之前,我们要先了解 软件的生命周期 ,虽然他们之间只差了两个字,但是差距还是很大的 首先是 软件生命周期 ,这个是站在 软件 的角…

【洛谷贪心算法题】P1094纪念品分组

该题运用贪心算法&#xff0c;核心思想是在每次分组时&#xff0c;尽可能让价格较小和较大的纪念品组合在一起&#xff0c;以达到最少分组的目的。 【算法思路】 输入处理&#xff1a;首先读取纪念品的数量n和价格上限w&#xff0c;然后依次读取每件纪念品的价格&#xff0c;…

[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解

一、前言 学习STM32一阵子以后&#xff0c;相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED&#xff0c;之前的寄存器只是作为一个引入&#xff0c;并没有深层次的讲解&#xff0c;在教…

SQL分组问题

下列为电商公司用户访问时间数据 统计某个用户连续的访问记录&#xff0c;如果时间间隔小于60s&#xff0c;就分为一组 id ts 1001 17523641234 1001 17523641256 1002 17523641278 1001 17523641334 1002 17523641434 1001 17523641534 1001 17523641544 1002 17523…

3月2日 C++日常习题测试一答案

C测试题答案与讲解 一、填空题答案及讲解 答案&#xff1a;const 讲解&#xff1a;在 C 中&#xff0c;const关键字用于定义常量&#xff0c;一旦定义&#xff0c;其值不能被修改。例如const int num 10;&#xff0c;这里的num就是一个常量。 答案&#xff1a;3 讲解&…

2W8000字 LLM架构文章阅读指北

❝ 大模型架构专栏已经更新了30多篇文章。完整的专栏内容欢迎订阅&#xff1a; LLM 架构专栏 1、LLM大模型架构专栏|| 从NLP基础谈起 2、 LLM大模型架构专栏|| 自然语言处理&#xff08;NLP&#xff09;之建模 3、 LLM大模型架构之词嵌入&#xff08;Part1&#xff09; 3、 LLM…