蓝桥杯算法精讲:二分查找实战与变种解析
适合人群:蓝桥杯备考生 | 算法竞赛入门者 | 二分查找进阶学习者
目录
一、二分查找核心要点
1. 算法思想
2. 适用条件
3. 算法模板
二、蓝桥杯真题实战
例题1:分巧克力(蓝桥杯2017省赛)
例题2:砍竹子(蓝桥杯2022省赛)
三、二分查找变种与技巧
1. 查找左边界
2. 查找右边界
四、常见错误与注意事项
五、蓝桥杯进阶练习题
一、二分查找核心要点
1. 算法思想
二分查找(Binary Search)是一种在有序序列中快速定位目标的算法,通过不断缩小搜索范围,将时间复杂度从O(n)降至O(log n)。
2. 适用条件
-
有序性:数据必须有序(升序或降序)
-
单调性:问题的解空间具有单调性(如求最大值最小、最小值最大)
3. 算法模板
def binary_search(arr, target): left, right = 0, len(arr) - 1 # 初始化左右指针 while left <= right: mid = left + (right - left) // 2 # 防止整数溢出 if arr[mid] == target: return mid # 找到目标,返回索引 elif arr[mid] < target: left = mid + 1 # 目标在右半部分 else: right = mid - 1 # 目标在左半部分 return -1 # 未找到
二、蓝桥杯真题实战
例题1:分巧克力(蓝桥杯2017省赛)
题目描述:
有N块巧克力,每块大小为H[i]×W[i]。需切割出K块大小相同的正方形,求最大边长。
问题分析:
-
单调性:边长越大,能切出的块数越少
-
二分目标:寻找满足块数≥K的最大边长
代码实现:
def max_chocolate_size(): N, K = map(int, input().split()) H = [] W = [] for _ in range(N): h, w = map(int, input().split()) H.append(h) W.append(w) # 二分范围:最小1,最大巧克力边长上限 left, right = 1, max(max(H), max(W)) ans = 0 while left <= right: mid = (left + right) // 2 cnt = 0 # 当前边长能切出的总块数 for i in range(N): cnt += (H[i] // mid) * (W[i] // mid) if cnt >= K: # 提前终止循环 break if cnt >= K: ans = mid # 记录可行解 left = mid + 1 # 尝试更大的边长 else: right = mid - 1 # 边长过大,缩小范围 return ans print(max_chocolate_size())
代码解析:
-
二分初始化:左边界为1,右边界取所有巧克力的最大边长
-
计算块数:对每块巧克力计算能切出的块数,累加直至超过K
-
调整边界:根据块数是否满足条件,动态调整左右边界
例题2:砍竹子(蓝桥杯2022省赛)
题目描述:
给定N棵竹子的高度H[i],每次操作可选择一棵竹子砍到⌊√(H+1)⌋,求所有竹子砍到1的最少操作次数。
问题分析:
-
逆向思维:从1反向计算每个高度需要多少次操作到达
-
预处理:对每个H[i],预计算其所有可能的中间值
代码实现:
import math def min_operations(): N = int(input()) H = list(map(int, input().split())) max_steps = 0 # 预处理每个竹子的操作链 for h in H: steps = 0 current = h while current > 1: # 逆向计算:current由next_step通过f(x)=x^2-1得到 next_step = math.isqrt(current - 1) + 1 steps += 1 current = next_step max_steps = max(max_steps, steps) return max_steps print(min_operations())
三、二分查找变种与技巧
1. 查找左边界
场景:数组中存在重复元素,找到第一个等于target的位置。
def left_bound(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = left + (right - left) // 2 if arr[mid] < target: left = mid + 1 else: right = mid - 1 # 压缩右边界 # 检查left是否越界或找到目标 return left if left < len(arr) and arr[left] == target else -1
2. 查找右边界
场景:找到最后一个等于target的位置。
def right_bound(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = left + (right - left) // 2 if arr[mid] <= target: left = mid + 1 # 压缩左边界 else: right = mid - 1 # 检查right是否有效 return right if right >=0 and arr[right] == target else -1
四、常见错误与注意事项
-
整数溢出:使用
mid = left + (right - left) // 2而非(left + right)//2 -
边界更新:确保每次循环边界必然缩小,防止死循环
-
终止条件:
while left <= right与left = mid + 1/right = mid -1配对使用 -
返回值验证:最终结果需检查是否有效(如索引是否越界)
五、蓝桥杯进阶练习题
-
数的范围(模板题):蓝桥杯题库
-
旋转数组的最小值(变种):蓝桥杯2021省赛
-
在排序数组中查找元素的第一个和最后一个位置:LeetCode 34
相关文章:
蓝桥杯算法精讲:二分查找实战与变种解析
适合人群:蓝桥杯备考生 | 算法竞赛入门者 | 二分查找进阶学习者 目录 一、二分查找核心要点 1. 算法思想 2. 适用条件 3. 算法模板 二、蓝桥杯真题实战 例题1:分巧克力(蓝桥杯2017省赛) 例题2:砍竹子࿰…...
C++脚本化方案调研
1 什么是脚本化 脚本化(Scripting)是指将脚本语言嵌入到主程序(C等编译型语言)中,通过以下方式扩展程序能力: 动态逻辑控制:通过脚本实现运行时逻辑调整,无需重新编译主程序&#x…...
蓝桥杯(N皇后问题)------回溯法
题目描述 在 NN 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 2 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45 角的斜线上。你的任务是,对于给定的 N,求出有多少种合法的放置方法…...
再探C语言(1)
温馨提示: 学C语言就像玩《掘地求升》——你以为懂了语法就能通关? 不!编译器会用铁锤教你做人!(╯‵□′)╯︵┻━┻ 🐱Part 1:sizeofの跨平台迷惑行为 Q1. 不同环境下sizeof(int)的结果 运行环境结果&a…...
高项第十三章——项目资源管理
什么是资源管理?项目资源管理包括识别、获取和管理所需资源以成功完成项目的各个过程。 本过程关注两类资源:实物资源包括设备、材料、设施和基础设施 团队资源或人员指的是团队的人力资源 13_1 项目资源管理基础 项目团队是执行项目工作,…...
C/C++转换为字符串宏和字符串拼接宏的综合使用
本文内容参考: C/C++ 宏拼接和宏展开为字符串 - DoubleLi - 博客园 特此致谢! 1. 转换为字符串宏与字符串拼接宏 (1)转换为字符串宏 转换为字符串的宏为: #define STR(x) #x //转字符串 (2)字符串拼接宏 字符串拼接的宏为: #define CONCAT(x,y) x##y //拼接 2…...
Linux:xxx is not in the sudoers file. This incident will be reported.
报错 xxx is not in the sudoers file. This incident will be reported.解决方式 切换到root用户下操作 # 1、修改/etc/sudoers文件为可修改,默认是只读的 ls -lh /etc/sudoers -r--r----- 1 root root 4.3K Dec 1 01:45 /etc/sudoerschmod uw /etc/sudoersls…...
掌握新编程语言的秘诀:利用 AI 快速上手 Python、Go、Java 和 Rust
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
个人常用的chrome好用插件
chrome可以说是兼容性和实用性较高的浏览器 没有复杂的ui 沉重的广告 加上各种各样的浏览器插件 现在罗列一下个人常用的几款好用的插件 1. Adblock Plus 一款免费的广告拦截器,可以拦截大部分网站上的广告推荐,还你一个干净舒服的页面 以下为b站演示…...
Redis 内存优化
Redis 内存优化 Redis性能优化可以从多个方面进行,主要包括以下几个方面: 1. 内存优化 Redis 是基于内存的数据库,优化内存使用可以提高性能并降低成本。 (1) 使用合适的数据结构 不同的数据结构占用的内存不同,选择合适的数据…...
数据库设计-笔记2
1.介绍一下MySQL 历史与发展 MySQL 最初由瑞典的 MySQL AB 公司开发,于 1995 年正式发布。2008 年,MySQL AB 公司被 Sun Microsystems 收购,之后 Sun 又被甲骨文(Oracle)公司收购,MySQL 成为 Oracle 旗下…...
【大模型】什么是循环神经网络(RNNs)
在人工智能(AI)的世界里,**循环神经网络(Recurrent Neural Networks, RNNs)**是一种非常强大的工具,特别适合处理序列数据。无论是语言、时间序列还是音乐,RNNs都能帮助我们理解和预测这些数据的…...
hexo+butterfly搭建博客网站总结篇
hexobutterfly搭建博客网站总结篇 文章目录 hexobutterfly搭建博客网站总结篇0.往期栏目1.发现的不错的butterfly博主2.待实现的功能 && 结语笔者待实现的功能结语 0.往期栏目 个人博客网站搭建_为了前进而后退,为了走直路而走弯路的博客-CSDN博客 【Node…...
损失函数理解(二)——交叉熵损失
损失函数的目的是为了定量描述不同模型(例如神经网络模型和人脑模型)的差异。 交叉熵,顾名思义,与熵有关,先把模型换成熵这么一个数值,然后用这个数值比较不同模型之间的差异。 为什么要做这一步转换&…...
基于随机森林回归预测葡萄酒质量
基于随机森林回归预测葡萄酒质量 1.作者介绍2.随机森林算法与数据集介绍2.1定义2.2核心思想2.3主要步骤2.4数据集介绍 3.算法实现3.1数据加载与探索3.2数据可视化3.3数据预处理(标准化、划分训练/测试集)3.4模型训练与优化(随机森林回归 超参…...
【Qt】QWidget属性2
🏠个人主页:Yui_ 🍑操作环境:Qt Creator 🚀所属专栏:Qt 文章目录 1. windowOpacity属性2. cursor属性2.1 自定义光标 3. font属性4.tooltip属性5. focusPolicy属性6. 总结 由于QWidget的常见属性实在太多&a…...
OpenGL ES ->乒乓缓冲,计算只用两个帧缓冲对象(Frame Buffer Object)+叠加多个滤镜作用后的Bitmap
乒乓缓冲核心思想 不使用乒乓缓冲,如果要每个滤镜作用下的绘制内容,也就是这个滤镜作用下的帧缓冲,需要创建一个Frame Buffer Object加上对应的Frame Buffer Object Texture使用乒乓缓冲,只用两个Frame Buffer Object加上对应的F…...
数据库练习2
目录 1.向heros表中新增一列信息,添加一些约束,并尝试查询一些信息 2.课堂代码练习 3.题目如下 一、单表查询 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号,不显示重复的部门号。 3、求出所有职工的人数。 4…...
macOS Sequoia 15.3 一直弹出“xx正在访问你的屏幕”
🙅 问题描述 macOS 系统升级后(15.2或者15.3均出现过此问题),不管是截图还是开腾讯会议,只要跟捕捉屏幕有关,都一直弹出这个选项,而且所有软件我都允许访问屏幕了,这个不是询问是否…...
OpenCV图像拼接(1)自动校准之校准旋转相机的函数calibrateRotatingCamera()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::calibrateRotatingCamera 是OpenCV中用于校准旋转相机的函数。它特别适用于那种相机相对于一个固定的场景进行纯旋转运动的情况&…...
Conda常用命令汇总(持续更新中)
原文章:安装和使用Miniconda来管理Python环境-CSDN博客 一、Miniconda的使用 Miniconda没有GUI界面,只能通过conda命令对Python环境和软件包进行管理,所以这里主要介绍一下conda的常用命令。 1. Conda相关 (1)查询conda版本 conda --vers…...
C# 调用 VITS,推理模型 将文字转wav音频调试 -数字人分支
Microsoft.ML.OnnxRuntime.OnnxRuntimeException: [ErrorCode:InvalidArgument] Input name: input_name is not in the metadata在 Microsoft.ML.OnnxRuntime.InferenceSession.LookupInputMetadata(String nodeName) 位置 D:\a\_work\1\s\csharp\src\Microsoft.ML.OnnxRuntim…...
Java锁等待唤醒机制
在 Java 并发编程中,锁的等待和唤醒机制至关重要,通常使用 wait()、notify() 和 notifyAll() 来实现线程间的协调。本文将详细介绍这些方法的用法,并通过示例代码加以说明。 1. wait()、notify() 与 notifyAll() 在 Java 中,Obj…...
Docker Compose 常用命令详解
Docker Compose 常用命令详解 Docker Compose 是 Docker 官方提供的一个用于管理多个容器的工具,可以使用 docker-compose.yml 文件定义和运行多容器应用。本篇博客将详细介绍 Docker Compose 的常用命令,帮助你更高效地管理容器。 1. docker compose u…...
C站算法技能题-题解(javascript)
切面条 const 切面条 (n10)>{return 2 ** n 1; } 切面条(0) 2 切面条(1) 3 切面条(2) 5 切面条(10) 1025大衍数列 const 大衍数列 (n100) > {let ans []for(let i1;i<n;i){if(i%2 0){ans.push((i ** 2 ) / 2)}else{ans.push((i ** 2 - 1) / 2)}}return ans…...
【Docker系列一】Docker 简介
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
C++进阶——封装红黑树实现map和set
目录 1、源码及框架分析 2、模拟实现map和set 2.1 复用的红黑树框架及Insert 2.2 iterator的实现 2.2.1 iterator的核心源码 2.2.2 iterator的实现思路 2.3 map支持[ ] 2.4 map和set的代码实现 2.4.1 MyMap.h 2.4.2 MySet.h 2.4.3 RBTree.h 2.4.4 Test.cpp 1、源码及…...
python基础-02-列表+序列数据类型
文章目录 【README】【4】python列表【4.1】列表数据类型【4.1.1】用索引取得列表中的单个值【4.1.2】负数索引【4.1.3】利用切片获取子列表【4.1.4】用索引改变列表中的值【4.1.5】列表连接与复制【4.1.6】del语句删除列表中的元素 【4.2】使用列表【4.2.1】列表用于循环【补充…...
‘闭包‘, ‘装饰器‘及其应用场景
‘闭包’, 装饰器’及其应用场景 一, 闭包及其应用场景 图解 闭包的定义 概述: 内部函数 使用了 外部函数 的变量, 这种写法就称之为闭包. 格式: def 外部函数名(形参列表):外部函数的(局部)变量def 内部函数名(形参列表):内部函数的(局部)变量return 内部函数名前提条件: …...
IDEA 快捷键ctrl+shift+f 无法全局搜索内容的问题及解决办法
本篇文章主要讲解IDEA、phpStrom、webStrom、pyCharm等jetbrains系列编辑器无法进行全局搜索内容问题的主要原因及解决办法。 日期:2025年3月22日 作者:任聪聪 现象描述: 1.按下ctrlshiftf 输入法转为了繁体。 2.快捷键ctrlshiftr 可以全局检…...
