(ACM模板)二分查找
二分是一个比较大的概念,广义上把东西(可能是问题,区间等等)一分为二都是二分。
这里讲二分查找。
据说只有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模板)二分查找的更多相关文章
- STL模板整理 Binary search(二分查找)
前言: 之前做题二分都是手动二分造轮子,用起来总是差强人意,后来看到STL才发现前辈们早就把轮子造好了,不得不说比自己手动实现好多了. 常用操作 1.头文件 #include <algorith ...
- LeetCode 二分查找模板 II
模板 #2: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...
- LeetCode 二分查找模板 I
模板 #1: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...
- LeetCode 二分查找模板 III
模板 #3: int binarySearch(vector<int>& nums, int target){ if (nums.size() == 0) return -1; i ...
- 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一]-CodeForces 237C,素数打表,二分查找
C. Primes on Interval time limit per test 1 second memory limit per test 256 megabytes input standar ...
- 线段树离散化 unique + 二分查找 模板 (转载)
离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率. 通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小.例如: 原数据:1,999,100000,15:处理 ...
- C++ STL中的Binary search(二分查找)
这篇博客转自爱国师哥,这里给出连接https://www.cnblogs.com/aiguona/p/7281856.html 一.解释 以前遇到二分的题目都是手动实现二分,不得不说错误比较多,关于返 ...
- Leetcode 69 Sqrt(x) 二分查找(二分答案)
可怕的同时考数值溢出和二分的酱油题之一,常在各种小公司的笔试中充当大题来给你好看... 题意很简单,在<二分查找综述>中有描述. 重点:使用简单粗暴的long long来避免溢出,二分均方 ...
- 分蛋糕(C - 二分查找)
分蛋糕 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/C Description My birthd ...
随机推荐
- LeetCode--056--合并区间(java)
给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] ...
- js事件循环机制
本文参考链接:https://www.jianshu.com/p/cf47bc0bf2ab 一.先搞懂两个东西:堆和栈 栈由操作系统自动分配释放,用于存放函数的参数值.局部变量等一些基本的数据类型,其 ...
- UE4开发PSVR游戏,使用RazorGPU进行调试的方法
打开Project Launcher,如果没有需要的Devkit平台目标,就点下方的Device Manager,右键Claim 相应的目标.如果已经出现在Project Launcher中,点击上方 ...
- html5: postMessage解决跨域通信的问题
效果图 postmessage解析 HTML5提供了新型机制PostMessage实现安全的跨源通信. 语法 otherWindow.postMessage(message, targetOrigin ...
- HTML --JS 选择框
<html> <head> <title>选择框</title> <script language="JavaScript"& ...
- Cordova指令
安装 cordova: npm install -g cordova 创建应用程序 cordova create hello com.example.hello HelloWorld cordov ...
- APT攻防整理-攻击方法/工具
攻击步骤 一般步骤 社工 武器制造 武器投递 漏洞利用 安装后门 后渗透 这5个阶段攻击非常隐蔽,可绕过传统安全设备检测 潜伏控制 传统通信方式不会使用,如cc/socket/http(可采用安全隧道 ...
- (转)https://wiki.debian.org/iwlwifi debian7下wifi intel 5100agn
https://wiki.debian.org/iwlwifi Debian 7 "Wheezy" Add a "non-free" component to ...
- BERT实战——基于Keras
1.keras_bert 和 kert4keras keras_bert 是 CyberZHG 大佬封装好了Keras版的Bert,可以直接调用官方发布的预训练权重. github:https://g ...
- 记一次Laravel 定时任务schedul:run未执行的处理
关于Laravel的任务调度(定时任务)的配置在此不做赘述,跟着官方文档一步一步的操作是不会导致定时任务不能正常工作的. 为保证能及时捕获定时任务执行出现异常的原因,只需在配置系统crontab时指定 ...