【算法通关指南:算法基础篇】二分算法: 1.A-B 数对 2.烦恼的高考志愿

【算法通关指南:算法基础篇】二分算法: 1.A-B 数对 2.烦恼的高考志愿
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人等方向学习者
❄️个人专栏:《C语言》《【初阶】数据结构与算法》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录


前言

本文将通过两道经典二分查找例题 ——A-B 数对与烦恼的高考志愿,带你系统掌握二分查找的核心思想与实用技巧。从排序预处理到lower_bound、upper_bound的灵活运用,再到手动实现二分与边界细节处理,由浅入深讲解算法原理与代码实现,帮助你快速攻克二分查找题型,提升编程思维与解题效率

一、A-B 数对

1.1题目

链接:A-B 数对

在这里插入图片描述

1.2 算法原理

由于顺序不影响最终结果,所以可以先把整个数组排序,来研究是佛否有其他的性质。
由A − B = C 得:B = A − C,由于C是已知的数,我们可以从前往后枚举所有的A ,然后去前面找有多少个符合要求的B ,正好可以用二分快速查找出区间的长度。
【STL使用】
1.lower_bound:传入要查询区间的左右迭代器(注意是左闭右开的区间,如果是数组就是左右指针)以及要查询的值k,然后返回该数组中 >= k的第一个位置
2.upper_bound :传入要查询区间的左右迭代器(注意是左闭右开的区间,如果是数组就是左右指针)以及要查询的值k ,然后返回该数组中 > k 的第⼀个位置;

例:a = [10, 20, 20, 20, 30, 40] ,设下标从1 开始计数,在整个数组中查询20 :lower_bound(a + 1, a + 1 + 6, 20) ,返回a + 2 位置的指针;upper_bound(a + 1, a + 1 + 6, 20) ,返回a + 5 位置的指针;

然后两个指针相减,就是包含20 这个数区间的长度。

在这里插入图片描述

1.3代码

#include <iostream>#include <algorithm> using namespace std; typedef long long LL; const int N=2e5+10;LL a[N]; int main(){ int n, c; cin >> n >> c;for(int i =1; i <= n; i++) cin >> a[i];sort(a +1,a +1+ n);LL ret =0;for(int i =2; i <= n; i++){LL b = a[i]- c; ret +=upper_bound(a +1,a + i +1,b)-lower_bound(a +1, a +1+ i, b);} cout << ret << endl;return0;}
注:同时STL的使用范围很「局限」,查询「有序序列」的时候才有用,数组无序的时候就无法使用。但是我们的二分算法也能在「数组无序」的时候使用,只要有「二段性」即可

二、烦恼的高考志愿

2.1 题目

链接:烦恼的高考志愿

在这里插入图片描述

2.2 算法原理

先把学校的录取分数「排序」,然后针对每一个学生成绩 ,在「录取分数」中二分出≥ b的「第一个」位置pos,那么差值最小的结果要么在pos位置,要么在位置pos - 1,那么最后的不满意度求法就为:
abs(a[pos] − b)与abs(a[pos − 1] − b)的最小值。

注:细节问题
如果所有元素都大于b的时候,pos − 1 会在0 下标的位置,有可能结果出错;
• 如果所有元素都小于pos的时候,pos会在n的位置,此时结果倒不会出错,但是我们要想到这个细节问题,这道题不出错不代表下⼀道题不出错。
解决方法:加上两个左右护法,结果就不会出错了

2.3 代码

//烦恼的高考志愿 #include <iostream>#include <algorithm> using namespace std; typedef long long LL; const int N=1e5+10;LL a[N],b[N],m,n;LLfind(LL x){ int l =1, r = m;while(l < r){LL mid =(l + r)/2;if(a[mid]>= x) r = mid;else l = mid +1;}return l;} int main(){ cin >> m >> n;for(int i =1; i <= m; i++) cin >> a[i];//设置左护法 a[0]=-1e7;sort(a +1, a +1+ m);LL ret =0;for(int i =1; i <= n; i++){ cin >> b[i];LL pos =find(b[i]); ret +=min(abs(a[pos -1]- b[i]),abs(a[pos]- b[i]));} cout << ret << endl;return0;}

总结与每日励志

✨通过两道题目,我们学会了利用排序与二分查找快速统计数对、寻找最优匹配,理解了边界处理与 STL 函数的正确使用。二分的本质是寻找二段性,代码简洁却考验思维。愿你在算法学习路上保持耐心与专注,每一次思考都在沉淀成长,永远相信美好的事情即将发生,坚持下去,终会遇见更优秀的自己。

在这里插入图片描述

Read more

解决 Keil MDK 编译报错:error: #5: cannot open source input file “xxx.h“

解决 Keil MDK 编译报错:error: #5: cannot open source input file “xxx.h“

最近碰到的问题:error: #5: cannot open source input file "xxx.h": No such file or directory,本质上这个错误的核心是编译器在指定的路径中找不到你代码里#include引用的头文件,本文将从原因分析、分步解决、避坑技巧三个维度,彻底解决这个问题。 (2026年1月27日) 一、错误原因分析 出现该错误的核心逻辑很简单:Keil 编译器在预处理阶段,会按照「当前文件目录→用户指定头文件路径→Keil 内置路径」的顺序查找头文件,当所有路径都找不到目标.h文件时,就会抛出这个错误。常见诱因分为以下几类: 1. 头文件实际不存在(文件名拼写错误、文件被误删、未添加到项目); 2. 头文件路径未添加到 Keil 的头文件搜索路径中; 3. 头文件引用格式错误(

By Ne0inhk

AR Core与CameraX的融合:测量应用从原理到实现

引言:AR测量如何改变我们对现实的认知 在现实世界中,我们经常需要测量物体的大小:装修时需要量家具尺寸,购物时需要知道包装大小,工作中需要精确测量距离。传统的测量工具(卷尺、激光测距仪)都有局限性。现在,通过手机摄像头和AR技术,我们可以实现"所见即所得"的智能测量。本文将带你深入理解AR测量的原理,并实现一个完整的AR测量应用。 第一章:技术基础 - 理解AR测量的核心原理 1.1 AR测量技术栈架构 ┌─────────────────────────────────────┐ │ 用户界面与交互层 │ │ 测量标注、手势识别、结果展示 │ ├─────────────────────────────────────┤ │ AR引擎层 (AR Core) │ │ 运动跟踪│环境理解│光照估计│点云生成 │ ├─────────────────────────────────────┤ │ 相机控制层 (CameraX) │ │ 图像采集│实时预览│图像分析│自动对焦 │ ├─────────────────────────────────────┤ │ 传感器融合层 │

By Ne0inhk
【数据集+完整源码】【YOLO】无人机数据集,目标检测无人机检测数据集 7261 张,YOLO无人机识别系统实战训练教程,yolo无人机检测。

【数据集+完整源码】【YOLO】无人机数据集,目标检测无人机检测数据集 7261 张,YOLO无人机识别系统实战训练教程,yolo无人机检测。

文章前瞻:优质数据集与检测系统精选 点击链接:更多数据集与系统目录清单 数据集与检测系统数据集与检测系统基于深度学习的道路积水检测系统基于深度学习的道路垃圾检测系统基于深度学习的道路裂缝检测系统基于深度学习的道路交通事故检测系统基于深度学习的道路病害检测系统基于深度学习的道路积雪结冰检测系统基于深度学习的汽车车牌检测系统基于深度学习的井盖丢失破损检测系统基于深度学习的行人车辆检测系统基于深度学习的航拍行人检测系统基于深度学习的车辆分类检测系统基于深度学习的电动车头盔佩戴检测系统基于深度学习的交通信号灯检测系统基于深度学习的共享单车违停检测系统基于深度学习的摆摊占道经营检测系统基于深度学习的人员游泳溺水检测系统基于深度学习的航拍水面垃圾检测系统基于深度学习的水面垃圾检测系统基于深度学习的水面船舶分类检测系统基于深度学习的海洋垃圾检测系统基于深度学习的救生衣穿戴检测系统基于深度学习的海洋生物检测系统基于深度学习的人员吸烟检测系统基于深度学习的口罩佩戴检测系统基于深度学习的烟雾和火灾检测系统基于深度学习的人员睡岗玩手机检测系统基于深度学习的人员摔倒检测系统基于深度学习的人员姿势检测系

By Ne0inhk