算法进阶——二分

二分法:

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

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

常见的二分类型有:

整数二分

浮点二分

二分答案

二分解题步骤:

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;
    else
        l=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;
    else
        l =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;
        else
            r=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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

deepseek+mermaid【自动生成流程图】

成果&#xff1a; 第一步打开deepseek官网(或百度版&#xff08;更快一点&#xff09;)&#xff1a; 百度AI搜索 - 办公学习一站解决 第二步&#xff0c;生成对应的Mermaid流程图&#xff1a; 丢给deepseek代码&#xff0c;或题目要求 生成mermaid代码 第三步将代码复制到me…

SQL Server2022版+SSMS安装教程(保姆级)

SQL Server2022版SSMS安装教程&#xff08;保姆级&#xff09; 一&#xff0c;安装SQL Server数据库 1.下载安装包 &#xff08;1&#xff09;百度网盘下载安装包 链接&#xff1a;https://pan.baidu.com/s/1A-WRVES4EGv8EVArGNF2QQpwd6uvs 提取码&#xff1a;6uvs &#…

Pany-v2:LFI漏洞探测与敏感文件(私钥窃取/其他)自动探测工具

地址:https://github.com/MartinxMax/pany 关于Pany-v2 Pany-v2 是一款 LFI&#xff08;本地文件包含&#xff09;漏洞探测工具&#xff0c;具备自动识别敏感文件的能力。它能够利用 LFI 漏洞检测并提取 id_rsa 私钥、系统密码文件以及其他可能导致安全风险的敏感信息。该工具…

【音视频】视频基本概念

一、视频的基本概念 1.1 视频码率&#xff08;kb/s&#xff09; 视频码率是指视频文件在单位时间内使用的数据流量&#xff0c;也叫码流率。码率越大&#xff0c;说明单位时间内取样率越大&#xff0c;数据流进度也就越高 1.2 视频帧率&#xff08;fps&#xff09; 视频帧率…

三维数据可视化与表面重建:Marching Cubes算法的原理与应用

1. 引言 随着现代医学影像技术的飞速发展&#xff0c;三维数据的可视化与重建已成为医学研究、临床诊断和手术规划的重要工具。在众多三维重建算法中&#xff0c;Marching Cubes算法因其高效、稳定的特性成为从离散数据场中提取等值面的经典方法。本报告将深入探讨Marching Cu…

探秘基带算法:从原理到5G时代的通信变革【七】FFT/DFT

文章目录 2.6 FFT/DFT2.6.1 离散傅里叶变换&#xff08;DFT&#xff09;2.6.2 快速傅里叶变换&#xff08;FFT&#xff09;2.6.3 方法论与分类体系2.6.4 优缺点与应用2.6.5 实现细节 本博客为系列博客&#xff0c;主要讲解各基带算法的原理与应用&#xff0c;包括&#xff1a;v…

水仙花数(华为OD)

题目描述 所谓水仙花数&#xff0c;是指一个n位的正整数&#xff0c;其各位数字的n次方和等于该数本身。 例如153是水仙花数&#xff0c;153是一个3位数&#xff0c;并且153 13 53 33。 输入描述 第一行输入一个整数n&#xff0c;表示一个n位的正整数。n在3到7之间&#x…

《Python实战进阶》No 7: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战

第7集&#xff1a; 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战 在现代 Web 开发中&#xff0c;实时通信已经成为许多应用的核心需求。无论是聊天应用、股票行情推送&#xff0c;还是多人协作工具&#xff0c;WebSocket 都是实现高效实时通信的最佳选择之一。本…

极简Redis速成学习

redis是什么&#xff1f; 是一种以键值对形式存储的数据库&#xff0c;特点是基于内存存储&#xff0c;读写快&#xff0c;性能高&#xff0c;常用于缓存、消息队列等应用情境 redis的五种数据类型是什么&#xff1f; 分别是String、Hash、List、Set和Zset&#xff08;操作命…

ADC采集模块与MCU内置ADC性能对比

2.5V基准电压源&#xff1a; 1. 精度更高&#xff0c;误差更小 ADR03B 具有 0.1% 或更小的初始精度&#xff0c;而 电阻分压方式的误差主要来自电阻的容差&#xff08;通常 1% 或 0.5%&#xff09;。长期稳定性更好&#xff0c;分压电阻容易受到温度、老化的影响&#xff0c;长…

python数据容器切片

从一个序列中取出一个子序列 序列[起始位置:结束位置:步长] 起始位置和结束位置 省略,表示从头取到尾 步长省略表示1 步长负数,表示从后往前取 步长-1 等同于将序列反转了

【网络安全 | 渗透测试】GraphQL精讲一:基础知识

未经许可,不得转载, 文章目录 GraphQL 定义GraphQL 工作原理GraphQL 模式GraphQL 查询GraphQL 变更(Mutations)查询(Queries)和变更(Mutations)的组成部分字段(Fields)参数(Arguments)变量别名(Aliases)片段(Fragments)订阅(Subscriptions)自省(Introspecti…

005-Docker 安装 Redis

Docker 安装 Redis 1.从镜像官网拉取Redis镜像2.创建实例并启动3.测试连接4.设置开机启动 1.从镜像官网拉取Redis镜像 镜像官网地址&#xff1a;https://hub.docker.com执行命令 -- 拉取最新的版本 docker pull redis查看镜像 docker images2.创建实例并启动 先创建好需要的…

【星云 Orbit • STM32F4】04.一触即发:GPIO 外部中断

【星云 Orbit- • STM32F4】04. 一触即发&#xff1a;外部中断控制 摘要 本文详细介绍了如何使用STM32F407微控制器的HAL库实现外部中断功能。通过配置GPIO引脚作为外部中断源&#xff0c;并在中断回调函数中处理按键事件&#xff0c;实现了按键控制LED状态翻转的功能。本文旨…

探索Elasticsearch:索引的CRUD

在企业环境中&#xff0c;Elasticsearch的索引CRUD&#xff08;创建Create、读取Read、更新Update、删除Delete&#xff09;操作是非常基础且频繁使用的功能。这些操作对于管理和维护数据至关重要&#xff0c;尤其是在处理大规模数据集和需要实时搜索与分析的应用场景中。 目录…

React antd的datePicker自定义,封装成组件

一、antd的datePicker自定义 需求&#xff1a;用户需要为日期选择器的每个日期单元格添加一个Tooltip&#xff0c;当鼠标悬停时显示日期、可兑换流量余额和本公会可兑流量。这些数据需要从接口获取。我需要结合之前的代码&#xff0c;确保Tooltip正确显示&#xff0c;并且数据…

NVIDIA GPU 架构详解:Pascal、Volta、Turing、Ampere、Ada、Hopper、Blackwell

目录 1. Pascal&#xff08;帕斯卡&#xff09;架构&#xff08;2016&#xff09;关键技术性能特性代表产品应用场景 2. Volta&#xff08;伏特&#xff09;架构&#xff08;2017&#xff09;关键技术性能特性代表产品应用场景 3.Turing&#xff08;图灵&#xff09;架构&#…

Linux 命令行的基本命令(生信)

常见的操作系统包括 Windows、Mac OS X 和 Unix 。Linux 是类 Unix 操作系 统&#xff0c; 可安装在各种各样的电脑硬件设备&#xff0c; 从手机、平板电脑、路由器到超级计算 机。Linux 是一个领先的操作系统&#xff0c;世界上最快的十台超级计算机运行的都是 Linux 操作系统…

ECharts--中国地图(无敌详细)

前段时间需要做一个中国地图的页面&#xff0c;要求是展示各地产品的销量&#xff0c;我就在网上搜了很多ECharts的资料&#xff0c;学习了一下怎么使用。 本着互相学习&#xff0c;共同进步的原则&#xff0c;特此分享一下自己的学习经验以及使用技巧。如果有用的话可以给老弟…

QwenVL 2.5-本地安装编译布署全教程

开篇 DeepSeek开源后我国又开源了一个震撼大模型,QwenVL2.5,这是一个多模态的模形,它可以认图、识图、更能作图,还能读懂video。 Qwen2.5-VL 的主要特点如下所示: 感知更丰富的世界:Qwen2.5-VL 不仅擅长识别常见物体,如花、鸟、鱼和昆虫,还能够分析图像中的文本、图表…