二分是一个比较大的概念,广义上把东西(可能是问题,区间等等)一分为二都是二分。

这里讲二分查找。

据说只有10%的程序员能写对二分。虽然二分是一个简单的算法。但是其变化和细节却并不简单。

整数二分:

因为mid取整的问题,如果不细心有可能会死循环。

所以写二分查找需要仔细考虑 答案在开/闭区间?mid向上/下取整?循环结束条件?这些选择的取舍不同会导致二分的写法不同,没有说必须哪一种是正确的。掌握自己喜欢的写法即可。

这里的二分保证答案必须在[L,R]闭区间,循环借宿条件为(L==R),答案下标为 L 。

代码如下,其中细节还是值得细细琢磨。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=;
int n,q,a[N],l,r; int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
sort(a+,a+n+); //查找满足>=q的第一个数(x或x的后继)
//因为是>=蓑衣用向下(即L)取整
//注意要保证答案在[L,R]区间,这里满足(a[mid]>=q)即mid在答案区间内r=mid,else即mid不在答案区间内l=mid+1舍弃mid
scanf("%d",&q);
l=,r=n;
while (l<r) {
int mid=l+(r-l)/;
if (a[mid]>=q) r=mid; else l=mid+;
}
cout<<a[l]; //查找满足<=q的最后一个数(x或x的前驱)
scanf("%d",&q);
l=,r=n;
while (l<r) {
int mid=l+(r+-l)/;
if (a[mid]<=q) l=mid; else r=mid-;
}
cout<<a[l]; return ;
}

浮点数二分:

因为不用考虑取整的问题,所以浮点数二分相当好些。

注意精度问题就可以了。

    double eps=1e-;
while (l+eps<r) {
double mid=(l+r)/;
if (check(mid)) l=mid; else r=mid;
}

三分求单峰函数极值:

当这个函数可能是单调函数时(极值点在端点), 三分算法无法到达端点位置, 所以要特判一下两个端点。

int lm, rm;
while(l<r)
{
lm = l+(r-l)/;
rm = lm+(r-lm)/;
if(a[lm] > a[rm]) r = rm;
else if(a[lm] == a[rm]) r=rm, l=lm;
else l = lm;
}

(ACM模板)二分查找的更多相关文章

  1. STL模板整理 Binary search(二分查找)

    前言: 之前做题二分都是手动二分造轮子,用起来总是差强人意,后来看到STL才发现前辈们早就把轮子造好了,不得不说比自己手动实现好多了. 常用操作 1.头文件 #include <algorith ...

  2. LeetCode 二分查找模板 II

    模板 #2: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...

  3. LeetCode 二分查找模板 I

    模板 #1: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...

  4. LeetCode 二分查找模板 III

    模板 #3: int binarySearch(vector<int>& nums, int target){ if (nums.size() == 0) return -1; i ...

  5. 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一]-CodeForces 237C,素数打表,二分查找

    C. Primes on Interval time limit per test 1 second memory limit per test 256 megabytes input standar ...

  6. 线段树离散化 unique + 二分查找 模板 (转载)

    离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率. 通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小.例如: 原数据:1,999,100000,15:处理 ...

  7. C++ STL中的Binary search(二分查找)

    这篇博客转自爱国师哥,这里给出连接https://www.cnblogs.com/aiguona/p/7281856.html 一.解释 以前遇到二分的题目都是手动实现二分,不得不说错误比较多,关于返 ...

  8. Leetcode 69 Sqrt(x) 二分查找(二分答案)

    可怕的同时考数值溢出和二分的酱油题之一,常在各种小公司的笔试中充当大题来给你好看... 题意很简单,在<二分查找综述>中有描述. 重点:使用简单粗暴的long long来避免溢出,二分均方 ...

  9. 分蛋糕(C - 二分查找)

    分蛋糕 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/C Description My birthd ...

随机推荐

  1. nginx之安装

    1.简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供俄 ...

  2. HTML5 游戏引擎的选择

    原生手游市场已是红海,腾讯.网易等寡头独霸天下,H5游戏市场或将成为下一个风口.据笔者所知,很多H5游戏开发团队由于选择引擎不慎导致项目甚至团队夭折.如何选择适合团队和项目的引擎,笔者通过学习和项目实 ...

  3. 富文本编辑器tinymce支持从word复制粘贴保留格式和图片的插件wordpaster

    tinymce是很优秀的一款富文本编辑器,可以去官网下载.https://www.tiny.cloud 这里分享的是它官网的一个收费插件powerpaste的旧版本源码,但也不影响功能使用. http ...

  4. CF613D Kingdom and its Cities 虚树 + 树形DP

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 300003 #define RG register usi ...

  5. CF1037H Security 后缀自动机 + right集合线段树合并 + 贪心

    题目描述: 给定一个字符串 $S$ 给出 $Q$ 个操作,给出 $L,R,T$,求出字典序最小的 $S_{1}$ 为 $S[L...R]$的子串,且 $S_{1}$ 的字典序严格大于 $T$. 输出这 ...

  6. 如何判断WebBrowser浏览器网页加载完成

    在工作中遇到了这样的问题,那就是要判断WebBrowser浏览器网页是否加载完成,通过搜索发现网友们解决这一问题的几种方法,但都不能解决实际问题,现在我们就来看看网友们是如何解决这一问题的. 一.通过 ...

  7. 基于MyBatis实现Dao编程

    基于MyBatis实现Dao编程 1.建立mybatis-config.xml文件 <?xml version="1.0" encoding="UTF-8" ...

  8. 洛谷P1546 最短网络 Agri-Net(最小生成树,Kruskal)

    洛谷P1546 最短网络 Agri-Net 最小生成树模板题. 直接使用 Kruskal 求解. 复杂度为 \(O(E\log E)\) . #include<stdio.h> #incl ...

  9. apicloud地图、即时通讯、人脸识别登录、以及平时踩过得坑

    apicloud技术浅谈 导语 apicloud 的学习也有一段时间了,这是我个人的一些经验,和踩过的坑,希望对大家能有一些帮助. apicloud的知识准备 apicloud 是一个用原生的思想搭建 ...

  10. SqlServer 高级查询

    高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student;   --all 查询所有 select all sex from ...