二分查找模板及例题

news2025/3/3 17:55:24

文章目录

  • 模板一:
    • 使用场景:
    • 解释:
    • 例题:
      • 数的范围
        • 题意:
      • 代码:
  • 模板二:
    • 使用场景:
    • 解释:
    • 例题:
      • [Building an Aquarium](https://codeforces.com/problemset/problem/1873/E)
        • 题意:
        • 代码:

模板一:

while(l < r){
	int mid = l + r >> 1;
	while(check(mid)) r = mid;
	else l = mid +1;
}

使用场景:

此模板用于找出满足条件的最小值,即尽量往左找。

解释:

当mid满足条件时,执行 r = m i d r=mid r=mid,将区间往左缩小,直到l==r时候找到答案 。

例题:

数的范围

题意:

给定一个按照升序排列的长度为 n n n的整数数组,以及 q q q个查询。对于每个查询,返回一个元素 k k k的起始位置和终止位置(位置从 0开始计数)。如果数组中不存在该元素,则返回 − 1 − 1 -1 -1 11

代码:

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N=100010;

int n,m;
int a[N];

int main()
{
	cin>>n>>m;
	
	for(int i=0;i<n;i++) cin>>a[i];
	
	while(m--)
	{
		int x;
		
		cin>>x;
		
		int l=0,r=n-1;
		while(l<r)
		{
			int mid=(l+r)>>1;
			if(a[mid]>=x) r=mid;
			else l=mid+1;
		}
		if(a[l]!=x)
		{
			cout<<"-1 -1"<<endl;
		}
		else
		{
			cout<<l<<" ";
			l=0,r=n-1;
			while(l<r)
			{
				int mid=(l+r+1)>>1;
				if(a[mid]<=x) l=mid;
				else r=mid-1;
			}
			cout<<l<<endl;
		}
	}
	return 0;
}

模板二:

while(l < r){
	int mid = (l + r + 1) >> 1;//提醒:mid的更新方式不太一样
	while(check(mid)) l = mid;
	else r = mid - 1;
}

使用场景:

用于找出满足条件的最大值,即尽量往右找。

解释:

m i d mid mid满足条件时,执行操作 l = m i d l = mid l=mid,此时区间会向右边缩小。

例题:

Building an Aquarium

题意:

你喜欢养鱼,所以你决定建造一个水族馆。你有一块由 n n n 根柱子组成的珊瑚,其中 i i i 根柱子高 a i a _{i} ai 个单位。之后,你将在珊瑚周围建造一个水族箱,具体如下:

  • 选取一个整数 h h h --水箱的高度。在水箱两侧建造高度为 h h h的墙壁。
  • 然后,在水箱中注满水,使每一列的高度都是 h h h ,除非珊瑚的高度超过 h h h ,否则这一列不需要注水。

例如, a = [ 3 , 1 , 2 , 4 , 6 , 2 , 5 ] a=[3,1,2,4,6,2,5] a=[3,1,2,4,6,2,5] 和高度为 h = 4 h=4 h=4 ,最终总共需要使用 w = 8 w=8 w=8 个单位的水,如图所示。

你最多可以用 x x x 个单位的水来装满水箱,但你想尽可能建造最大的水箱。你能选择的 h h h 的最大值是多少?

代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define int long long

using namespace std;

void solve(){
	int n,x;
	
	cin>>n>>x;
	vector<int> a(n);
	
	for(int i=0;i<n;i++) cin>>a[i];
	
	int l=0;
	int r=2000000007;
	while(l<r){
		int ans=0;
		int mid=(r+l+1)/2;
		for(int i=0;i<n;i++) ans+=max((long long)0,mid-a[i]);
		if(ans<=x) l=mid;
		else r=mid-1;
	}
	
	cout<<l<<endl;
}
signed main(){
	int t;
	
	cin>>t;
	
	while(t--) solve();
	
	return 0;
}

由于本人写二分时,范围总是出错,总是把两个mid的更新方式搞混,特写此文章加深记忆。

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

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

相关文章

Tita的OKR:最新20个HR人力资源OKR案例

OKR是一个目标设定框架&#xff0c;可以提高员工的参与度&#xff0c;同时帮助人们专注于最重要的事情。 然而&#xff0c;OKR最大的挑战之一是设定正确的目标&#xff0c;我与很多人力资源专业人士交谈过&#xff0c;他们证明他们的OKR并不完美。 这就是为什么我们收集了最佳…

【2024_CUMCM】机器学习导论、不平衡分类模型(重采样)、交叉验证(附代码)

目录 基本概念 机器学习概念与过程 机器学习的分类 学习任务 分类与回归区分 学习方式 不平衡分类模型 什么是不平衡分类 下采样的优点和缺点 过采样的优点和缺点 交叉验证 what 过拟合 常见方法 K折交叉验证&#xff08;K-Fold Cross Validation&#xff09; …

后VMware时代,一体化技术平台建设思路

在数字化转型的浪潮中&#xff0c;企业对IT基础设施的需求正在发生根本性的变化。VMware时代的结束&#xff0c;为企业带来了重新构建技术平台的机遇与挑战。6月28日&#xff0c;在主题为【聚力生态&#xff0c;VMware全链替代】的线上研讨会上&#xff0c;灵雀云首席解决方案专…

适合运动的骨传导耳机有哪些?总结五款适合运动的骨传导耳机推荐

在追求健康生活的浪潮中&#xff0c;运动健身蔚然成风&#xff0c;而运动时的音乐陪伴更是不可或缺。然而&#xff0c;传统耳机在运动场景下的种种不便&#xff0c;促使市场寻找更佳解决方案。此时&#xff0c;骨传导耳机应运而生&#xff0c;以其独特的传音方式&#xff0c;为…

ESP32-WROVER-E/ESP32-WROVER-IE模组硬件相关

ESP32-WROVER-E和ESP32-WROVER-IE区别 带I的为采用外部天线&#xff0c;不带I的使用PCB天线。 模组后缀N16R8&#xff0c;16为4、8、16为FLASH存储器容量&#xff0c;8为8或2&#xff0c;为PSRAM的容量&#xff0c;单位均为MB。 模组芯片 ESP32-WROVER-E 和 ESP32-WROVER-IE…

tkinter-TinUI-xml实战(11)多功能TinUIxml编辑器

引言 在TinUIXml简易编辑器中&#xff0c;我们通过TinUI搭建了一个简易的针对TinUIXml布局的编辑器&#xff0c;基本掌握了TinUIXml布局和TinUIXml的导入与导出。现在&#xff0c;就在此基础上&#xff0c;对编辑器进行升级。 本次升级的功能&#xff1a; 更合理的xml编辑与…

【洞见】智算操作系统,推进算力迈入普惠智算新时代

WAIC 2024世界人工智能大会暨人工智能全球治理高级别会议正式拉开帷幕&#xff0c;面向世界徐徐展示人工智能技术最前沿的理念和成果。九章云极DataCanvas公司董事长方磊受邀参加大会开幕式&#xff0c;并在“迈向AGI&#xff1a;大模型焕新与产业赋能”论坛发表主题演讲&#…

docker 上传镜像到hub仓库

要将 Docker 镜像上传到 Docker Hub&#xff0c;你需要按照以下步骤操作&#xff1a; 登录 Docker Hub 首先&#xff0c;你需要登录到 Docker Hub。打开终端并运行以下命令&#xff1a;docker login系统会提示你输入 Docker Hub 的用户名和密码。 如果密码忘记可以token登录&a…

函数式接口、匿名内部类、lambda表达式

一、函数式接口 只有一个抽象方法的接口叫函数式接口&#xff0c;不能有两个&#xff0c;也不能有方法实现。 FunctionalInterface注解标记&#xff0c;在idea中可以用这个注解验证是不是函数式接口。实现函数式接口可以转成lambda表达式。 二、匿名内部类 匿名内部类的格式&a…

[k8s源码]1.client-go集群外部署

client-go是由k8s发布且维护的专门用于开发者和kubernetes交互的客户端库。它支持对k8s资源的CRUD操作&#xff08;create、read、update、delete&#xff09;&#xff0c;事件监听和处理&#xff0c;访问kubernetes集群的上下文和配置。 client go是独立于kubernetes集群之外…

爬虫如此简单?一文教会网络爬虫!

在今天的网络环境中&#xff0c;数据的获取对于许多电商和信息分析人员来说至关重要。但是频繁的数据采集行为可能会导致目标网站对你的IP进行封锁或限制访问频率。这时候&#xff0c;使用代理IP可以是一个有效的解决方案。本文将向你介绍如何使用代理IP进行网络爬虫&#xff0…

《计算机研究与发展》投稿经验

前言 记录下投计研展正刊的经验。跟专刊不同哈&#xff0c;专刊会更快&#xff0c;我看好像也有专刊的经验分享。【计算机研究与发展投稿记录】 期刊简介 来源计研展官网&#xff1a; 《计算机研究与发展》是中国科学院计算技术研究所和中国计算机学会联合主办的学术性期刊&a…

sqlmap确定目标/实操

安装kali&#xff0c;kali自带sqlmap&#xff0c;在window系统中跟linux系统操作有区别 sqlmap是一款自动化SQL工具&#xff0c;打开kali终端&#xff0c;输入sqlmap&#xff0c;出现以下界面&#xff0c;就说明sqlmap可用。 sqlmap确定目标 一、sqlmap直连数据库 1、直连数据库…

电机控制杂谈——基于偏置电压注入的载波PWM策略/简化版SVPWM

1.前言 SVPWM策略需要非常繁琐的计算过程&#xff08;扇区判断、电压矢量作用时间计算、各相开关切换顺序排布、各相开关切换时间计算&#xff0c;同时SVPWM还存在大量的查表法&#xff09;。这在一定程度上限制了控制频率的提高&#xff08;因为SVPWM计算复杂&#xff0c;会占…

centos 安装ffmpeg

这个错误表明在你的 CentOS 系统的默认仓库中没有 ffmpeg 包。CentOS 的默认仓库通常不包含 ffmpeg&#xff0c;因为它涉及一些许可证问题。但是&#xff0c;你可以通过添加第三方仓库来安装 ffmpeg。 使用 EPEL 和 RPM Fusion 仓库 # 安装 EPEL 仓库 sudo yum install epel-…

TIA博途Wincc中画箭头和管道的具体方法示例

TIA博途Wincc中画箭头和管道的具体方法示例 如何画箭头? 如下图所示,在右侧的工具箱中找到基本对象—线,点击选中, 如下图所示,在画面中添加一条线段,然后右键进入该线段的属性,设置线的外观: 宽度、样式、颜色; 线端:这里可以选择起始和结束的样式,选择“箭头”,则…

压测引擎数据库设计(下)

压测引擎数据库设计&#xff08;下&#xff09; 引言 上一篇博文讲述了我们压测引擎数据库设计的上半部分的内容&#xff0c;这一篇博文将会把压测引擎数据库设计最后的内容也讲完。 上一篇博文已经把下图的“项目”、“环境”和“压测模块”三张表已经设计完成&#xff0c;这…

零基础STM32单片机编程入门(十三) 红外避障传感器模块实战含源码

文章目录 一.概要二.红外避障模块主要参数1.模块引脚定义2.模块特点3.模块原理图 三.STM32单片机红外避障模块检测实验四.CubeMX工程源代码下载五.小结 一.概要 红外避障模块具有一对红外线发射与接收管&#xff0c;发射管发射出一定频率的红外线&#xff0c;当检测遇到障碍物…

【香橙派5】使用frp建立香橙派内网穿透

1、首先进入github下载需要用的tar包 https://github.com/fatedier/frp/releases请一定一定看清楚&#xff0c;一个是amd&#xff0c;一个是arm不要上传岔了&#xff01;&#xff01;&#xff01; 2、上传之后&#xff0c;服务器端进行修改 首先进行压缩包解压 tar -zxvf f…

ENSP软件中DHCP的相关配置以及终端通过域名访问服务器

新建拓扑 配置路由器网关IP 设备配置命令&#xff1a;<Huawei> Huawei部分为设备名 <>代表当下所在的模式&#xff0c;不同模式下具有不同的配置权限<Huawei> 第一级模式&#xff0c;最低级模式 查看所有参数<Huawei>system-view 键入系统视图…