跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

二分算法实战:A-B 数对与高考志愿录取匹配

综述由AI生成A-B 数对与烦恼的高考志愿两道经典例题展示了二分查找的核心应用。内容涵盖排序预处理、STL 函数 lower_bound/upper_bound 的使用及手动实现二分的边界处理技巧。重点分析如何寻找二段性、处理数组越界情况以及利用左右护法优化代码健壮性,帮助掌握二分法在统计与匹配问题中的实际解题思路。

人间过客发布于 2026/3/23更新于 2026/6/1215 浏览
二分算法实战:A-B 数对与高考志愿录取匹配

一、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;
    return 0;
}

注:同时 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;

LL find(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;
    return 0;
}

总结

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

目录

  1. 一、A-B 数对
  2. 1.1 题目
  3. 1.2 算法原理
  4. 1.3 代码
  5. 二、烦恼的高考志愿
  6. 2.1 题目
  7. 2.2 算法原理
  8. 2.3 代码
  9. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Windows 下安装 OpenClaw 并接入飞书机器人实战指南
  • 利用腾讯云 HAI 与 DeepSeek 快速构建个人网页
  • 数据洞察系统 InsightPilot 技术解析与架构分析
  • 小巧的 MCPHost:命令行大模型与外部工具交互指南
  • FUXA:基于 Web 的 HMI-SCADA-Dashboard 可视化组态平台
  • Microsoft Visual C++ 运行库安装与 DLL 报错修复指南
  • 2026 AI图像生成变体处理技巧:全角半角+简繁转换
  • OpenAI 指控 DeepSeek 非法蒸馏,字节发布 Seedance 2.0,Java 26 预览版上线
  • Z-Image-ComfyUI 文生图模型入门与部署
  • Office 区域不支持 Copilot 的解决方法
  • LLM 工具调用统一 API 设计与实战
  • 常见漏洞扫描工具及 Nmap 使用指南
  • Java 反射机制详解:原理、场景与实战
  • TF-IDF 与 BM25:经典信息检索算法详解
  • Cursor 实战:从零开发 Web 背单词应用
  • Web 安全学习体系与常见漏洞实战解析
  • C++ 哈希表原理与实现
  • C++ 二叉搜索树:概念、性能分析与核心实现
  • Java synchronized 底层原理:字节码、对象头与锁升级
  • 从零构建C++自动微分库:实现Dual Number与运算符重载

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online