C++二分查找
一、模板①:向下取整(mid = (l + r) >> 1)
while (l < r) {int mid = l + r >> 1; // 等价于 (l + r) / 2(向下取整)if (check(mid)) r = mid; // 保留左半区else l = mid + 1; // 舍弃左半区
}
适用场景
-
查找左边界(最小值)
- 例如:在有序数组中找到 第一个大于等于目标值 的位置
- 逻辑:当
check(mid)满足条件时,说明目标值可能在左半区(包括mid),因此右边界r缩小到mid;否则,左边界l移动到mid + 1。 - 关键特征:区间收缩时 保留左半区,
mid向下取整可避免死循环
-
寻找满足条件的最小值
- 例如:求满足
x² ≤ target的最大整数x(即平方根的整数部分) - 原因:向下取整确保中间值偏向左侧,逐步逼近最小可行解。
- 例如:求满足
二、模板②:向上取整(mid = (l + r + 1) >> 1)
while (l < r) {int mid = l + r + 1 >> 1; // 等价于 (l + r + 1) / 2(向上取整)if (check(mid)) l = mid; // 保留右半区else r = mid - 1; // 舍弃右半区
}
适用场景
-
查找右边界(最大值)
- 例如:在有序数组中找到 最后一个小于等于目标值 的位置
- 逻辑:当
check(mid)满足条件时,说明目标值可能在右半区(包括mid),因此左边界l移动到mid;否则,右边界r缩小到mid - 1。 - 关键特征:区间收缩时 保留右半区,
mid向上取整可防止循环卡死
-
寻找满足条件的最大值
- 例如:求巧克力切割的最大边长,使得总块数满足要求
- 原因:向上取整确保中间值偏向右侧,逐步逼近最大可行解。
三、核心区别与选择依据
| 特征 | 模板①(向下取整) | 模板②(向上取整) |
|---|---|---|
mid 计算 | mid = (l + r) / 2 | mid = (l + r + 1) / 2 |
| 区间收缩 | 保留左半区(r = mid) | 保留右半区(l = mid) |
| 适用方向 | 左边界、最小值、左侧优先 | 右边界、最大值、右侧优先 |
| 防死循环 | 确保 l 和 r 逐步靠近 | 避免 l 和 r 无法缩小范围 |
选择原则
- 分析问题目标:明确是找左边界还是右边界,是求最小值还是最大值。
- 观察区间更新:若更新
l = mid,则必须向上取整;若更新r = mid,则需向下取整 - 验证边界条件:通过极端用例(如
l和r相邻时)检查是否可能陷入死循环。
例题:
问题描述
小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 XX,当普通金属 O 的数目不足 V 时,无法继续冶炼。
现在给出了 N 条冶炼记录,每条记录中包含两个整数 A 和 B,这表示本次投入了 A 个普通金属 O,最终冶炼出了 B 个特殊金属 X。每条记录都是独立的,这意味着上一次没消耗完的普通金属 O 不会累加到下一次的冶炼当中。
根据这 N 条冶炼记录,请你推测出转换率 V 的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况。
输入格式
第一行一个整数 N,表示冶炼记录的数目。
接下来输入 N 行,每行两个整数 A、B,含义如题目所述。
输出格式
输出两个整数,分别表示 V 可能的最小值和最大值,中间用空格分开。
#include<bits/stdc++.h> // 包含所有标准库头文件(实际工程中不建议使用)#define rep(i, a, b) for(int i = a; i < b; i++) // 简化循环的宏定义using namespace std;
const int N = 1e4 + 10; // 定义常量(但代码中未实际使用)
int n;// 二分查找函数:寻找满足条件的最大/最小值[6,8](@ref)
int get(int a, int b)
{int l = 1, r = a; // 初始化搜索范围为[1, a]while(l < r) // 标准二分查找结构[7](@ref){int mid = l + r >> 1; // 等效于(l + r)/2(向下取整)// 核心判断条件:当a/mid <= b时,收缩右边界if(a / mid <= b)r = mid; // 满足条件时尝试更小的值else l = mid + 1; // 不满足条件时增大下界}return r; // 最终收敛到满足条件的最小值[8](@ref)
}int main()
{cin >> n; // 读取输入的对数// 初始化极值(minv为下限,maxv为上限)int minv = 1; // 最小值的初始下界int maxv = 1e9; // 最大值的初始上界int a, b;rep(i, 0, n) // 遍历每个输入对{scanf("%d%d", &a, &b);// 关键逻辑:对多个区间取交集[10,11](@ref)// 更新最小值下限(取所有区间的最大左端点)minv = max(minv, get(a, b));// 更新最大值上限(取所有区间的最小右端点)maxv = min(maxv, get(a, b - 1) - 1);}// 输出最终的交集区间cout << minv << " " << maxv;return 0;
}
问题描述
儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有 N 块巧克力,其中第 i 块是 Hi×Wi 的方格组成的长方形。为了公平起见,
小明需要从这 N块巧克力中切出 K 块巧克力分给小朋友们。切出的巧克力需要满足:
-
形状是正方形,边长是整数;
-
大小相同;
例如一块 6×5 的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?
输入描述
第一行包含两个整数 N,K (1≤N,K≤105)。
以下 N 行每行包含两个整数 Hi,Wi (1≤Hi,Wi≤105)。
输入保证每位小朋友至少能获得一块 1x1 的巧克力。
输出描述
输出切出的正方形巧克力最大可能的边长。
#include<bits/stdc++.h>
using namespace std; const int N=1e5+5; // 定义常数N,表示矩形数量的上限
int h[N],w[N]; // 定义两个数组,分别存储每个矩形的高和宽
int n,k,m; // 定义变量n表示矩形数量,k表示目标正方形数量,m用于存储矩形尺寸的最大值 // 定义一个检查函数,判断给定的正方形边长mid是否满足条件
bool check(int mid){ int sum=0; // 用于计算可以切割出的正方形数量 for(int i=0;i<n;i++){ // 遍历每个矩形 sum+=(h[i]/mid)*(w[i]/mid); // 计算当前矩形可以切割出的正方形数量,并累加到sum中 } if(sum>=k){ // 如果满足至少k个正方形的要求 return true; // 返回true }else{ return false; // 否则返回false }
} void solve(){ int l=1,r=m; // 定义二分查找的左右边界,l为最小可能边长1,r为矩形的最大尺寸 while(l<r){ // 当左边界小于右边界时,继续二分查找 int mid=l+(r-l)/2; // 计算中点,并向上取整(因为l+r可能是奇数) if(check(mid)){ // 如果mid满足条件 l=mid; // 更新左边界为mid,继续寻找更小的满足条件的边长 }else{ r=mid-1; // 否则,更新右边界为mid-1,寻找更大的边长 } } cout<<l<<'\n'; // 输出最小的满足条件的边长
} signed main(){ ios::sync_with_stdio(0); // 取消C++和C的输入输出同步,加快输入输出速度 cin.tie(0); // 解除cin与cout的绑定,加快输入输出速度 cout.tie(0); cin>>n>>k; // 输入矩形数量n和目标正方形数量k for(int i=0;i<n;i++){ // 遍历每个矩形 cin>>h[i]>>w[i]; // 输入矩形的高和宽 m=max(h[i],m); // 更新m为矩形尺寸的最大值 m=max(w[i],m); } solve(); return 0;
}
相关文章:
C++二分查找
一、模板①:向下取整(mid (l r) >> 1) while (l < r) {int mid l r >> 1; // 等价于 (l r) / 2(向下取整)if (check(mid)) r mid; // 保留左半区else l mid 1; // 舍弃左半区 } 适用场…...
一个Linux/Java乱码问题的解决
公司有个项目采用的是spring-boot启动方式,以前上线正常,前几天重新上线后,突然发现上传的文件名中文乱码了。我了解了一下具体情况,以前是正常的,而且测试环境也都是正常的,就是生产环境本次上线后突发从页…...
【Java设计模式】第11章 装饰者模式讲解
11.1 装饰者模式讲解 定义:动态扩展对象功能,替代继承。类型:结构型模式适用场景: 运行时动态添加功能避免类爆炸(如多层装饰)优点: 比继承更灵活符合开闭原则缺点: 增加类/对象数量调试复杂度高11.2 装饰者模式 Coding // 抽象组件 public abstract class BatterCake…...
通过AWS EKS 生成并部署容器化应用
今天给大家分享一个实战例子,如何在EKS上创建容器化应用并通过ALB来发布。先介绍一下几个基本概念: IAM, OpenID Connect (OIDC) 2014 年,AWS Identity and Access Management 增加了使用 OpenID Connect (OIDC) 的联合身份支持。此功能允许…...
nginx入门,部署静态资源,反向代理,负载均衡使用
Nginx在linux上部署静态资源 概念介绍 Nginx可以作为静态web服务器来部署静态资源。这里所说的静态资源是指在服务端真实存在,并且能够直接展示的一些文件,比如常见的html页面、css文件、js文件、图片、视频等资源。 相对于Tomcat,Nginx处理…...
智膳优选 | AI赋能的智慧食堂管理专家 —— 基于飞书多维表格和扣子(Coze)的智能解决方案
智膳优选 | AI赋能的智慧食堂管理专家 基于飞书多维表格和扣子(Coze)的智能解决方案 数据驱动餐饮管理,让每一餐都是营养与经济的完美平衡! “智膳优选”通过整合飞书与Coze,将数据智能引入校园餐饮管理࿰…...
深入解析 MySQL 中的日期时间函数:DATE_FORMAT 与时间查询优化、DATE_ADD、CONCAT
深入解析 MySQL 中的日期时间函数:DATE_FORMAT 与时间查询优化 在数据库管理和应用开发中,日期和时间的处理是不可或缺的一部分。MySQL 提供了多种日期和时间函数来满足不同的需求,其中DATE_FORMAT函数以其强大的日期格式化能力,…...
最新的es版本忘记密码,重置密码
刚刚安装了最新的es版本,就忘了密码,怎么重置密码呢? 一、进入es的斌目录 #进入es文件/bin 目录 ./elasticsearch-reset-password -u elastic 二 、输入对应的密码 然后再次访问 我的是去掉了ssl的访问 三、如果报错:解决 [main] WARN...
Compose Multiplatform+Kotlin Multiplatfrom 第五弹跨平台 截图
截图功能 Compose MultiplatformKotlin Multiplatfrom下实现桌面端的截图功能,起码搞了两星期,最后终于做出来了,操作都很流畅,截取的文件大小也正常,可参考支持讨论! 功能效果 代码实现 //在jvmMain下创…...
Elasticearch数据流向
Elasticearch数据流向 数据流向图 --- config: layout: elk look: classic theme: mc --- flowchart LR subgraph s1["图例"] direction TB W["写入流程"] R["读取流程"] end A["Logstash Pipeline"] -- 写入请求 --> B["Elas…...
在docker里装rocketmq-console
首先要到github下载(这个一般是需要你有梯子) GitHub - apache/rocketmq-externals at release-rocketmq-console-1.0.0 如果没有梯子,用下面这个百度网盘链接下 http://链接: https://pan.baidu.com/s/1x8WQVmaOBjTjss-3g01UPQ 提取码: fu…...
使用Python写入JSON、XML和YAML数据到Excel文件
在当今数据驱动的技术生态中,JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体。然而,当需要将这类半结构化数据转化为具备直观可视化、动态计算和协作共享特性的载体时&…...
从零开始构建智能聊天机器人:Rasa与ChatGPT API实战教程
引言:AI对话系统的时代机遇 在数字化转型浪潮中,聊天机器人已成为连接用户与服务的关键纽带。无论是客服系统中的724小时即时响应,还是智能家居中的语音交互,聊天机器人正在重塑人机交互方式。本文将通过详细教程,手把…...
编码常见的 3类 23种设计模式——学习笔记
一、创建型(用于方便创建实例) 1. 单例模式 优点: 确保系统中只有一个实例存在,避免多个实例导致的资源冲突或数据不一致问题。例如,数据库连接池、线程池等全局资源管理器适合用单例实现。 减少频繁创建和销毁对象的开销,尤其适…...
# 实时人脸性别与年龄识别:基于OpenCV与深度学习模型的实现
实时人脸性别与年龄识别:基于OpenCV与深度学习模型的实现 在当今数字化时代,计算机视觉技术正以前所未有的速度改变着我们的生活与工作方式。其中,人脸检测与分析作为计算机视觉领域的重要分支,已广泛应用于安防监控、智能交互、…...
x-cmd install | Slumber - 告别繁琐,拥抱高效的终端 HTTP 客户端
目录 核心优势,一览无遗安装应用场景,无限可能示例告别 GUI,拥抱终端 还在为调试 API 接口,发送 HTTP 请求而苦恼吗?还在各种 GUI 工具之间切换,只为了发送一个简单的请求吗?现在,有…...
apijson 快速上手
apijson是强大的工具,简化了CRUD的操作,只要有数据库表,就能自动生成RESTFUL接口。但初次上手也是摸索了很长时间,尤其是部署与使用上,这里尝试以初学者角度来说下: 一、好处 1、对于简单的应用ÿ…...
3D激光轮廓仪知识整理
文章目录 1.原理和应用场景1.1 相机原理1.1.1 测量原理1.1.2 相机激光器1.1.3 沙姆镜头1.1.4 相机标定1.1.5 中心线提取 1.2 应用场景1.2.1 测量相关应用1.2.2 缺陷检测相关应用 2.相机参数介绍及选型介绍2.1 成像原理2.2 原始图成像2.3 生成轮廓图2.4 相机规格参数2.4.1 单轮廓…...
Stable Diffusion+Pyqt5: 实现图像生成与管理界面(带保存 + 历史记录 + 删除功能)——我的实验记录(结尾附系统效果图)
目录 🧠 前言 🧾 我的需求 🔧 实现过程(按功能一步步来) 🚶♂️ Step 1:基本图像生成界面 🗃️ Step 2:保存图片并显示历史记录 📏 Step 3:…...
使用WasmEdge将InternLM集成到Obsidian,打造本地智能笔记助手
本文来自社区投稿,作者Miley Fu,WasmEdge Runtime 创始成员。 本文将介绍如何通过 WasmEdge 将书生浦语(InternLM)大模型部署在本地,并与 Obsidian 笔记软件集成,从而在笔记软件中直接利用大模型实现文本总…...
深入理解Softmax函数及其在PyTorch中的实现
Softmax函数简介 Softmax函数在机器学习和深度学习中,被广泛用于多分类问题的输出层。它将一个实数向量转换为概率分布,使得每个元素介于0和1之间,且所有元素之和为1。 Softmax函数的定义 给定一个长度为 K K K的输入向量 z [ z 1 , z 2 …...
JGraphT 在 Spring Boot 中的应用实践
1. 引言 1.1 什么是 JGraphT JGraphT 是一个用于处理图数据结构和算法的 Java 库,提供了丰富的图类型和算法实现。 1.2 为什么使用 JGraphT 丰富的图类型:支持简单图、多重图、伪图等多种图类型。强大的算法库:提供最短路径、最小生成树、拓扑排序等多种算法。易于集成:…...
java导入excel更新设备经纬度度数或者度分秒
文章目录 一、背景介绍二、页面效果三、代码0.pom.xml1.ImportDevice.vue2.ImportDeviceError.vue3.system.js4.DeviceManageControl5.DeviceManageUserControl6.Repeater7.FileUtils8.ResponseModel9.EnumLongitudeLatitude10.词条 四、注意点本人其他相关文章链接 一、背景介…...
视频设备轨迹回放平台EasyCVR远程监控体系落地筑牢国土监管防线
一、背景概述 我国土地资源遭违法滥用的现象愈发严峻,各类土地不合理利用问题频发。不当的土地开发不仅加剧了地质危害风险,导致良田受损、森林资源的滥伐,还引发了煤矿无序开采、城市开发区违建等乱象,给国家宝贵的土地资源造成…...
tree-sitter 的 grammar.js 编写方法
tree-sitter 的 grammar.js 编写方法 一、grammar.js 的作用是什么?二、基本结构三、关键词解释四、编写小技巧1. 起点是 source_file2. 所有规则名(如 identifier, number)都是 $ > ...3. 正则表达式用于定义词法规则(终结符&…...
Git 实践笔记
这里写自定义目录标题 一、将当前改动追加到某次commit上二、git 强制修改分支位置 一、将当前改动追加到某次commit上 stash工作区中的当前改动 git stash假设需要修改的commit是 f744c32,将HEAD移动到需要改动的commit的父提交上 git rebase f744c32^ --interact…...
【特权FPGA】之数码管
case语句的用法: 计数器不断的计数,每一个num对应数码管一种数据的输出。实例通俗易懂,一目了然。 timescale 1ns / 1ps// Company: // Engineer: // // Create Date: // Design Name: // Module Name: // Project Name: //…...
Stable Diffusion 四重调参优化——项目学习记录
学习记录还原:在本次实验中,我基于 Stable Diffusion v1.5模型,通过一系列优化方法提升生成图像的质量,最终实现了图像质量的显著提升。实验从基础的 Img2Img 技术入手,逐步推进到参数微调、DreamShaper 模型和 Contro…...
遇到git提交报错:413
是因为提交文件过大导致内存溢出。 解决方法: 假设您的提交历史如下: Apply to .gitignore abcd123 当前提交 efgh456 包含node_modules的提交 ijkl789 较早的正常提交 您可以: 回退到添加node_modules之前的提交: bash App…...
关于nacos注册的服务的ip异常导致网关路由失败的问题
文章目录 关于nacos注册的服务的ip异常导致网关路由失败的问题相关处理方案为方案一:手动指定服务注册的 IP 地址方法二:设置优先使用的网络段方法三:指定网络接口方法四:忽略特定的网卡 备注 关于nacos注册的服务的ip异常导致网关路由失败的…...
