写在前面:我们主要还是分享算法的模板,而不是去刨析算法的原理!

定义: 二分答案是指在答案具有单调性的前提下,利用二分的思想枚举答案,将求解问题转化为验证结果。

流程:
首先需要估计答案的上下界,然后不断取区间中点进行验证(这就要求答案的验证应当简单可行),并通过验证结果不断更新答案区间,最终得到答案。不难看出,朴素的枚举验证时间复杂度是O(n)的,而二分可以做到O(logn)
特征:
1.答案具有单调性
2.二分答案的问题往往有固定的问法,比如:令最大值最小(最小值最大),求满足条件的最大(小)值等。


// 在单调递增序列a中查找>=x的数中最小的一个(即x或x的后继)
while (l < r) {int mid = (l + r) / 2;if (a[mid] >= x) r = mid; else l = mid + 1;
}// 在单调递增序列a中查找<=x的数中最大的一个(即x或x的前驱)
while (l < r) {int mid = (l + r + 1) / 2;if (a[mid] <= x) l = mid; else r = mid - 1;
}// 实数域二分,设置eps法
while (l + eps < r) {double mid = (l + r) / 2;if (calc(mid)) r = mid; else l = mid;
}// 实数域二分,规定循环次数法
for (int i = 0; i < 100; i++) {double mid = (l + r) / 2;if (calc(mid)) r = mid; else l = mid;
}// 把n本书分成m组,每组厚度之和<=size,是否可行
bool valid(int size) {int group = 1, rest = size;for (int i = 1; i <= n; i++) {if (rest >= a[i]) rest -= a[i];else group++, rest = size - a[i];}return group <= m;
}// 二分答案,判定“每组厚度之和不超过二分的值”时能否在m组内把书分完
int l = 0, r = sum_of_Ai;
while (l < r) {int mid = (l + r) / 2;if (valid(mid)) r = mid; else l = mid + 1;
}
cout << l << endl;

『ACM-算法-二分法』信息竞赛进阶指南--二分法相关推荐

  1. 『ACM--算法--KMP』信息竞赛进阶指南--KMP算法(模板)

    简介: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用匹 ...

  2. 『ACM-数据结构』信息竞赛进阶指南--线段树

    我们主要是讲代码实现,不是讲基本原理! 什么是线段树? 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点 ...

  3. 『ACM-算法-数据结构』信息竞赛进阶指南--树状数组 (模板)

    写在前面: 我们是主要是讲算法模板,即实现的代码,并不讲实现的原理 什么是树状数组? 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度 ...

  4. 『ACM-算法-离散化』信息竞赛进阶指南--离散化

    数据离散化是一个非常重要的思想. 为什么要离散化? 当以权值为下标的时候,有时候值太大,存不下. 所以把要离散化的每一个数组里面的数映射到另一个值小一点的数组里面去. 打个比方,某个题目告诉你有104 ...

  5. 『ACM-算法-Hash算法』信息竞赛进阶指南--字符串哈希

    字符串hash主要应用在: 寻找长度为n的主串S中的匹配串T(长度为m)出现的位置或次数的问题属于字符串匹配问题. 类似的还有KMP,我也有讲解. 原理: 将字符串中的每一个字母都看做是一个数字(例: ...

  6. 『ACM-算法-ST算法』信息竞赛进阶指南--区间最值问题的ST算法

    借助倍增和动态规划可以实现O(1)的时间复杂度的查询 预处理: ①区间DP 转移方程 f[i][j] = min(MAX同理)(f[i][j - 1],f[i + ][j - 1]) f[i][j]表 ...

  7. 『ACM--数据结构--字典树』信息竞赛进阶指南--Tire树

    主要不是讲实现,是分享代码! 啥是字典树: Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎 ...

  8. 『ACM-算法-枚举法』信息竞赛进阶指南--枚举方法

    你以为枚举是一个一个的找? 还真是 你以为枚举都是for循环? 还真是 但你真的会枚举吗?组合型枚举,指数型枚举,排列型枚举?难道你只会线形枚举? 你可太菜了! // 递归实现指数型枚举 vector ...

  9. 信息竞赛进阶指南--搜索相关(模板)

    ACM常用模板合集 // 深度优先遍历框架 void dfs(int x) {v[x] = 1;for (int i = head[x]; i; i = next[i]) {int y = ver[i ...

最新文章

  1. 2022-2028年中国搪胶行业市场深度分析及投资前景分析报告
  2. IncDec Sequence(codevs 2098)
  3. 构建虚拟工控环境系列 - 西门子虚拟PLC
  4. [3]工欲善其事必先利其器-------UML常用的图(三)
  5. 计算机科学导论第二章,补基础:自学:计算机科学导论 第二章 数字系统
  6. Java 洛谷 P1425 小鱼的游泳时间
  7. camunda流程引擎如此简单(二)
  8. CodeForces - 1284B New Year and Ascent Sequence(乱搞)
  9. HDU - 4612 Warm up(边双缩点+树的直径)
  10. HBae找不到协处理器导致RegionServer全部挂掉
  11. [codeforces538F]A Heap of Heaps
  12. 35+ 个 Java 代码性能优化总结
  13. 可由一个尾指针唯一确定的链表有_六十九、数据结构链表的实现
  14. 数商云DMS渠道商城系统全渠道营销场景应用举例,赋能日化行业增强渠道掌控力
  15. 这些好玩的例子,希望你也能喜欢
  16. 曲面积分的投影法_大学数学:第一、二型曲面积分:投影、高斯公式补面挖点怎么用...
  17. php取FBOX数据,如何实现如下功能
  18. Mac壁纸软件哪款好用?Wallpaper Wizard可以一试
  19. 各大IT公司2012校园招聘笔试面试整理
  20. 计算机专业怎么发顶刊,计算机顶会和顶刊哪个厉害_计算机顶会_顶会

热门文章

  1. 获取手机信息(UIDevice、NSBundle、NSLocale)
  2. 开源网站统计程序 oracle,利用百夫长统计程序源码免费搭建独立网站统计软件工具...
  3. Spring_Bean的作用域---和使用外部属性文件
  4. 人工智能是互联网下一轮变革的核心
  5. 英国电信公司沃达丰遭到网络攻击
  6. An unspecified error occurred!
  7. Linux Kernel 3.0新特性概览(转)
  8. shell编程中特殊字符的问题总结
  9. service 层 拼接的html 代码如何直接返回_代码分层的设计之道
  10. 一致性哈希算法与Java实现