算法进阶——二分

二分法:

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

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

常见的二分类型有:

整数二分

浮点二分

二分答案

二分解题步骤:

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.rhkb.cn/news/27629.html

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

相关文章

使用mermaid查看cursor程序生成的流程图

一、得到cursor生成的流程图文本 cursor写的程序正常运行后&#xff0c;在对话框输入框中输入诸如“请生成扫雷的代码流程图”&#xff0c;然后cursor就把流程图给生成了&#xff0c;但是看到的还是文本的样子&#xff0c;保留这部分内容待用 二、注册一个Mermaid绘图账号 …

MacOS本地部署Deepseek,不联网也可以使用AI,保护隐私

苹果笔记本本地部署deepseek主要用到Ollama与open-webui 1. 安装Ollama “Ollama” 是一个轻量级的 AI 模型运行时环境&#xff08;runtime&#xff09;&#xff0c;旨在简化在本地部署和使用大语言模型&#xff08;LLM&#xff09;的过程。它由 Vicarious 公司开发&#xff…

unity学习62,尝试做第一个小游戏项目:flappy bird

目录 学习参考 1 创建1个unity 2D项目 1.1 2D项目模板选择 1.1.1 2D(built-in-Render pipeline) 1.1.2 universe 2D 1.1.3 这次选择 2D(built-in-Render pipeline) 1.2 创建项目 1.2.1 注意点 1.2.2 如果想修改项目名 2 导入美术资源包 2.1 下载一个flappy bird的…

基于Matlab的多目标粒子群优化

在复杂系统的设计、决策与优化问题中&#xff0c;常常需要同时兼顾多个相互冲突的目标&#xff0c;多目标粒子群优化&#xff08;MOPSO&#xff09;算法应运而生&#xff0c;作为群体智能优化算法家族中的重要成员&#xff0c;它为解决此类棘手难题提供了高效且富有创新性的解决…

使用DiskGenius工具来实现物理机多硬盘虚拟化迁移

使用DiskGenius工具来实现物理机多硬盘虚拟化迁移 概述准备工作注意事项实操过程记录1、Win7虚拟机&#xff0c;安装有两个硬盘&#xff08;硬盘0和硬盘1&#xff09;&#xff0c;各分了一个区&#xff0c;磁盘2是一块未使用的磁盘2、运行DiskGenius程序&#xff0c;记录现有各…

win本地vscode通过代理远程链接linux服务器

时间&#xff1a;2025.2.28 1. win本地下载nmap.exe nmap官网 https://nmap.org/或者 https://nmap.org/download#windows下载win版本并安装。 2. vscode插件Remote-SSH 插件下载Remote-SSH 3. 配置 按照图中顺序配置ssh 1.点击左侧工具栏的“小电视”图标 2.点击ssh的…

yolo初体验

看别人说的好简单,3行代码完成yolo11: from ultralytics import YOLO model YOLO("yolo11x.pt")##第一次运行自动下载 model.predict(source"0",showTrue) 当然代码没错:但是环境不好配: 首先:pip install ultralytics 会主动下载依赖 pytorch pandas-…

TCP 连接故障排查与 SYN 洪泛攻击防御

1 SYN 洪泛攻击防御 1.1 SYN Flood是什么&#xff1f; SYN Flood是互联网上最原始、最经典的DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务&#xff09;攻击之一&#xff0c;旨在耗尽可用服务器资源&#xff0c;致使服务器无法传输合法流量。 SYN…

ArcGIS Pro应用指南:如何为栅格图精确添加坐标信息

一、引言 在地理信息系统中&#xff0c;栅格图是一种重要的数据类型。 然而&#xff0c;有时我们从网络上获取的栅格图并不包含坐标信息&#xff0c;这使得它们难以与其他带有坐标信息的数据进行集成和分析。 为了解决这一问题&#xff0c;我们需要对栅格图进行地理配准&…

Spring Boot 与 MyBatis 版本兼容性

初接触Spring Boot&#xff0c;本次使用Spring Boot版本为3.4.3&#xff0c;mybatis的起步依赖版本为3.0.0&#xff0c;在启动时报错&#xff0c;报错代码如下 org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name userMapper…

CSS—text文本、font字体、列表list、表格table、表单input、下拉菜单select

目录 1.文本 2.字体 3.列表list a.无序列表 b.有序列表 c.定义列表 4.表格table a.内容 b.合并单元格 3.表单input a.input标签 b.单选框 c.上传文件 4.下拉菜单 1.文本 属性描述color设置文本颜色。direction指定文本的方向 / 书写方向。letter-spacing设置字符…

Linux之环境变量(超详细版)

前言:各位老铁们好&#xff0c;好久没分享知识了&#xff0c;今天我要和各位老铁分享的是环境变量 &#xff0c;对于Linux操作系统的学习者&#xff0c;我们会经常使用到环境变量&#xff0c;那么什么是环境变量呢&#xff1f;在讲环境变量之前&#xff0c;先问各位老铁一个问题…

【C语言】联合体 `union` 的妙用

C 语言联合体的妙用:结合 . 和 -> 操作符与 typedef 的深入剖析 在 C 语言中,联合体(union)是一种独特的复合数据类型,因其内存共享特性而在内存优化、类型切换和底层操作中展现出妙用。与结构体(struct)不同,联合体允许同一块内存存储不同类型的数据,提供高效且灵…

macOS - 使用 tmux

文章目录 安装 tmux使用更多快捷键说明 安装 tmux brew install tmux使用 在终端输入 tmux 进入 tmux 界面&#xff0c;然后 输入 Control Option B 进入交互模式 输入 % 左右分栏&#xff0c;" 上下分割 上一个窗格&#xff1a;{&#xff0c;下一个&#xff1a;} PS…

构建私有化AI知识库:基于CentOS的Ollama + DeepSeek-R1 +ragflow 整合部署教程

操作系统&#xff1a;CentOS 7.9 CPU&#xff1a;支持 AVX 指令集的 x86_64 处理器 内存&#xff1a;64GB 存储&#xff1a;SSD 1TB 以上 GPU&#xff08;可选&#xff09; 一、组件介绍 Ollama Ollama 是一个专为在本地机器上部署和运行大型语言模型&#xff08;LLM&a…

Goby 漏洞安全通告| Ollama /api/tags 未授权访问漏洞(CNVD-2025-04094)

漏洞名称&#xff1a;Ollama /api/tags 未授权访问漏洞&#xff08;CNVD-2025-04094&#xff09; English Name&#xff1a;Ollama /api/tags Unauthorized Access Vulnerability (CNVD-2025-04094) CVSS core: 6.5 风险等级&#xff1a; 中风险 漏洞描述&#xff1a; O…

Linux命令超级汇总

文件和目录操作 命令语法常用选项及说明lsls [选项] [目录名]- -l&#xff1a;以长格式显示文件和目录信息 - -a&#xff1a;显示所有文件&#xff0c;包括隐藏文件 - -h&#xff1a;与 -l 配合&#xff0c;以人类可读的方式显示文件大小 - -R&#xff1a;递归显示子目录内容cd…

Python 爬取唐诗宋词三百首

你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例&#xff0c;它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…

14. LangChain项目实战1——基于公司制度RAG回答机器人

教学视频&#xff1a; 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置&#xff1a; python版本&#xff1a;3.10.8 服务器&#xff1a;Ubuntu 依赖包requirements.txt文件内容&#xff1a; aiofiles23.2.1 …

香港首个人工智能大模型HKGAI V1发布:粤语AI时代正式开启

2月25日&#xff0c;香港科技创新领域迎来了一项里程碑式的成就——由香港特区政府重点创科项目“InnoHK 创新香港研发平台”慷慨资助的香港生成式人工智能研发中心(HKGAI)正式揭晓了其倾力打造的HKGAI V1大模型。这一创举不仅标志着香港在人工智能发展道路上迈出了坚实的一步&…