当前位置: 首页 > news >正文

二分

基础思路:答案是具有连续性的,它首先一定可以通过for循环一个个枚举出来判断是不是真正答案,在此基础上想要优化,才应该想到‘二分’这个算法。大多数时候,二分是复合在别的算法中出现的小优化。

二分的板子不算难抄,但是有很多随机应变的小问题:
1、二分L和R的边界问题。打个比方:洛谷P1182(数列分段 Section II),这道题中如果给出的数列是‘4 7 5 3 9’,那么无论怎么切是一定切不出来‘1’的。此时如果你的L边界为1,判断它的时候,程序遇到一个数字发现它大于1,就会把每个数字都切一下,切出来‘4’‘7’‘5’‘3’‘9’,但实际上并没有任何一个数确确实实等于‘1’了,(因为我们判断是根据大于了就切一刀的思路来判断的)。
2、二分过程中判断成立与否的check函数设计。二分通常会出现一些‘切割’‘增设节点’之类的问题,要注意到底切几刀、到底增几个,打个比方:洛谷P3853([TJOI2007] 路标设置),一段长为4的路,想要分成2的长度,要加几个路标?4/2是错误的,事实上只用放一个标就可以分成两个2了,这是小学数学经典的减一问题。

板子
while (l < r) { int mid = (l + r) / 2; (check函数设计) if (res > M) { l = mid + 1; } else { r = mid; }这个是针对最大值最小的,当res==M的时候还可以找更小的,所以把R移到mid位置,继续往小去找。

最小值最大就是反过来,然后r=mid-1;

也有泛用的,看见挺多人用过,我自己也用过了(P2678 [NOIP 2015 提高组] 跳石头),记一下
while(l+1<r){ int mid=(l+r)/2; if(check(mid)) l=mid; else r=mid; }

也算泛用,但我没用过:
while(l<=r) { int mid=(l+r)/2; if(check(mid)) { ans=mid; r=mid-1; } else l=mid+1; }

http://www.sczhlp.com/news/294.html

相关文章:

  • lazarus无法编译Linux下的动态库
  • 微信小程序提示不在合法域名问题
  • Clop勒索团伙针对MoveIt Transfer软件的大规模攻击活动分析
  • 语音解耦技术推动语音AI的多样性与包容性
  • 银河麒麟V10离线安装 tomcat 9 记录
  • fiddler篡改数据
  • Docker
  • SpringMVC具体的工作流程
  • SketchUp 2021+必备插件|AFU321 v5.5.6安装与使用说明
  • SketchUp纹理神器:Architextures插件安装与使用教程(图文详解)
  • redis-基本使用
  • nepCTF2025 pwn题解
  • 论文解读《GradEscape: A Gradient-Based Evader Against AI-Generated Text Detectors》
  • 使用 DeepSpeed ZeRO、LoRA 和 Flash Attention 微调 Falcon 180B
  • 28、快捷键
  • linux系统添加Arial字体
  • 基于卷积神经网络的验证码识别系统设计与实现
  • 【数据库索引标准结构】B+树原理详解与B树对比优势
  • 12N90-ASEMI电源逆变器专用12N90
  • Locust入门及最佳实践
  • Gitee Git自建平台:企业级代码托管的安全之选
  • Java核心面试技术
  • 人力资源各系统的关联与一体化趋势:从独立到协同的必然之路
  • 评估Gitee作为DevOps平台:功能详解与适用性分析
  • business
  • 4、如何给一万张图片重命名
  • 基于FFmpeg开发的在线m3u8转MP4在线工具(开发步骤+类库)
  • 米牛图片搬运去重大师手机版使用教程
  • debian12 修改源为阿里
  • 分享一个 AI 自动生成流程图的工具