二分查找与二分答案

学习笔记 - 二分查找与答案(附归并模版、前缀和、差分) 二分也就是二分查找,又叫折半查找。这种算法正如其名,每一次都要分一半。二分算法可以分为二分查找和二分答案。以在一个升序数组中查找一个数为例,每次考察数组当前部分的中间元素,如果中间元素刚好是要找的,就结束搜索过程;如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;如果中间元素大于所查找的值同理,只需到左侧查找。二分查找和二分答案有什么区别?二分查找:在一个已知的有序数据集上进行二分地查找二分答案:答案有一个区间,在这个区间中二分,直到找到最优答案。 阅读详情

壹·二分查找

一、基础

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

int x, n, mid, high, low = 1;

int main() {
	scanf("%d %d", &x, &n);
	high = n;
	
	while(low < high) {
		mid = (high+low)/2;
		if(mid < x) 
			low = mid+1;
		else 
			high = mid;
	}
	
	printf("%d right", x);
	return 0;
}

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

int x, n, mid, high, low = 1;

int main() {
	scanf("%d %d", &x, &n);
	high = n;
	
	while(low < high) {
		mid = (high+low+1)/2;
		if(mid > x) 
			high = mid-1;
		else 
			low = mid;
	}
	
	printf("%d right", x);
	return 0;
}

二、进阶

1. 查找第一个大于 x x x 的数
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

int l = 1, r, mid, n, s;
int a[20005];

void bs(){
	while(l<r) {
		mid= (l+r)/2;
		if(a[mid] > s)
			r = mid;
		else l = mid+1;
	}
}

int main() {
	scanf("%d", &n);
	r = n+1;
	for(int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	scanf("%d", &s);
	
	sort(a+1, a+1+n);
	bs();
	
	(l > r)? printf("No\n"): printf("%d", a[l]);
	return 0;
}

2. 查找第一个大于等于 x x x 的数
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

int l = 1, r, mid, n, s;
int a[20005];

void bs(){
	while(l<r) {
		mid= (l+r)/2;
		if(a[mid] >= s)
			r = mid;
		else l = mid+1;
	}
}

int main() {
	scanf("%d", &n);
	r = n+1;
	for(int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	scanf("%d", &s);
	
	sort(a+1, a+1+n);
	bs();
	
	(l > r)? printf("No\n"): printf("%d", a[l]);
	return 0;
}

3. 查找第一个小于 x x x 的数
// 第一个小于 
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

int l = 1, r, mid, n, s;
int a[20005];

void bs(){
	while(l<r) {
		mid= (l+r+1)/2;
		if(a[mid] >= s)
			r = mid-1;
		else l = mid;
	}
}

int main() {
	scanf("%d", &n);
	r = n+1;
	for(int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	scanf("%d", &s);
	
	sort(a+1, a+1+n);
	bs();
	
	(l < 1)? printf("No\n"): printf("%d", a[l]);
	return 0;
}

4. 查找第一个小于等于 x x x 的数
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

int l = 1, r, mid, n, s;
int a[20005];

void bs(){
	while(l<r) {
		mid= (l+r+1)/2;
		if(a[mid] <= s)
			r = mid-1;
		else l = mid;
	}
}

int main() {
	scanf("%d", &n);
	r = n+1;
	for(int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	scanf("%d", &s);
	
	sort(a+1, a+1+n);
	bs();
	
	(l < 1)? printf("No\n"): printf("%d", a[l]);
	return 0;
}

贰·二分答案

二分查找与二分答案详解 本文介绍了二分查找算法及其应用,从猜数字游戏引入二分思想,逐步分析其时间复杂度为O(logn)的高效特性。重点讲解了二分答案的扩展应用,以洛谷P1182数列分段问题为例,详细说明了如何通过二分答案框架和检验函数来求解最大值最小化问题。文章还总结了二分算法的注意事项(边界处理、防溢出等)和典型应用场景(方程求解、资源分配等),强调了这种算法思维通过指数级缩小搜索空间实现高效求解的优势。 阅读详情

相关推荐

二分查找与二分答案模板

二分查找是一种高效的搜索算法,通过不断折半缩小范围来查找目标值。标准写法使用闭区间[l,r],通过比较中间值mid与目标值x来调整边界。另一种优化写法使用开区间(l,r),避免边界溢出问题,循环条件改为l+1≠r。二分答案则用于求解最值问题,通过猜测答案并验证其可行性来缩小范围。核心在于设计正确的check函数,并确保单调性。两种方法时间复杂度均为O(logn),适用于有序数据或满足单调性的问题场景。

XTX的博客 497

二分查找与二分答案(Acwing)

【代码】二分查找与二分答案(Acwing)

2301_81856985的博客 1528

二分查找与二分答案(1)

 我们在写程序的时候,经常会遇到这样一类问题:在一个数组中查找一个数是不是存在。比如在下图的数组中,查找8是不是存在:  如果不要求效率,我们最一般的查找方法就是顺序查找,依次查看a[0], a[1], …, a[n-1],检查是不是等于8。这样对于长度为n的数组,平均查找长度是n/2  如果数组是有序的,比如是递增的,就像上图[1, 2, 3, 4, 5, 7, 8, 10, 11, 1...

mathor的博客 2059

Python二分查找与二分答案

二分查找是一种在有序数组中查找特定元素的算法。通过每次将搜索范围减半,时间复杂度为O(log n)。二分答案是一种将问题转化为判定性问题,并通过二分查找逼近最优解的算法范式。确定搜索范围的上下界。

team01bcm123的博客 317

CSP-J 算法基础 二分查找与二分答案

在算法的世界里,二分查找是一种经典的、非常高效的搜索方法,通常用于在有序数组中快速定位某个目标值。而“二分答案”则更进一步,将二分思想运用于更广泛的问题领域,通过不断缩小搜索范围,逐步逼近一个最优解或找到某个满足特定条件的临界值。二分查找与二分答案作为算法基础的核心思想,在CSP-J考试中频繁出现,掌握这两种方法不仅能够帮助我们解决查找问题,还能有效应对最小化、最大化及临界点等复杂问题。二分查找与二分答案是算法中的重要工具,其高效性源于每次都将搜索范围对半分,快速缩小查找范围。

m0_62599305的博客 1937

Rocky Linux 9.0国内yum源一键替换指南(上海交大镜像站实测)

本文详细介绍了如何将Rocky Linux 9.0的yum源替换为上海交大镜像站,以解决国内用户访问官方源速度慢的问题。通过实测验证,上海交大镜像站提供高速下载和稳定更新,并提供了完整的替换步骤、常见问题解决方案及高级优化配置,帮助用户提升软件包下载效率。

weixin_29304985的博客 358

ACM预备队week2二分查找与二分答案

二分法初学--NEUQacm第二周作业

Eyumbo的博客 1504

ARM CMSIS DAP源码分析(二)

今天分析的是RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)和RDDI_DAP_SetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)这两个函数。 以RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)为例,代码如下:

pengxiao618的专栏 7976

二分查找与二分答案(C++)

二分查找是一种用于在有序数组或容器中查找特定元素的算法。它的基本思想是先确定待查找区间的上下界,然后在每一步将待查找区间缩小一半,直到找到目标元素或确定目标元素不存在为止。二分查找是一种高效的查找算法,其,相比于,能够更快速地找到目标元素。在C++中,二分查找还可以通过STL中的算法函数进行实现。

2401_86809552的博客 1912

从实习生到独立上手:我是如何用海思PQTool搞定IPC图像调试的

本文分享了从实习生到独立使用海思PQTool进行IPC图像调试的成长历程。通过工具搭建、核心参数调整和实战案例,详细介绍了如何高效解决图像质量问题,特别强调了ISP调试中的关键参数和实用技巧,适合刚入门的图像调试工程师参考。

weixin_33756596的博客 311

2025.06.25【微生物】|Emu工具安装与使用详解:全长16S扩增子微生物丰度分析

Emu是一款基于贝叶斯方法的微生物多样性分析工具,专为处理高错误率的长读长16S/18S扩增子数据优化。本文详细介绍了Emu的安装与使用方法:1)通过conda创建独立环境并安装Emu;2)提供SILVA等预构建数据库的下载指南,并说明自定义数据库的构建方法;3)演示单样本和多样本分析流程,解读关键输出文件;4)介绍丰度表合并、分类等级汇总等实用功能扩展;5)建议后续分析方向。文章还附有官方GitHub链接和相关文献资源,为微生物群落结构研究提供了一套完整的分析解决方案。

1255

二分查找与二分答案入门c++

比原来的二分多一步,即寻找第一次出现的位置,所以while循环中相等的情况需要额外判断是不是第一次。其实如果没有那两个return 0的语句会RE两个,作者也不知道怎么回事。给学校排序,根据学生的分数找学校(二分),直到找到小于等于学生分数的学校。a-b=c转化为a=b+c,找到所有的a使b+c=a。找a的时候用二分,可以拿92分(样例3TLE力)介绍两个非常好用的函数,方法和上面一样,详见注释。原来是要开long long。对切出来的最大值进行二分。欧耶,过了过了过了!

2401_88089822的博客 1155

将AAL图谱对应到Yeo7大网络中【原理,代码分析】

本文介绍了将AAL2图谱映射到Yeo7大功能网络的方法。通过整合皮层(Yeo2011)、小脑(Buckner2011)和纹状体(Choi2012)三个区域的功能网络图谱,采用投票机制确定每个AAL区域的网络归属。具体步骤包括:1)统计每个AAL区域体素在各网络图谱中的分布;2)选择体素数量最多的网络作为该区域的最终标签。该方法实现了从解剖结构到功能网络的映射,可获得120个AAL区域对应的7大功能网络标签。

yes666666的博客 2204
上一篇: c++音乐头文件
下一篇: c++常用头文件
return_dr
博客等级 码龄5年 216粉丝 105原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值