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

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

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

人间过客发布于 2026/3/23更新于 2026/8/2436 浏览
二分算法实战: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 + , a +  + i, b);
    }
    cout << ret << endl;
     ;
}
1
1
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

更多推荐文章

查看全部
  • Java 后端 Web API 开发全流程实战
  • 无人机发展简史:近现代篇(3)
  • OpenFang 实战:Rust 驱动的 Agent OS 本土化部署指南
  • 国产 AI 双雄对决:智谱 GLM-5 与 MiniMax M2.5
  • 开源 IPTV 播放器 IPTVnator 功能与使用指南
  • OpenClaw 上手:环境、模型与飞书集成全流程
  • AI 编程模型深度对比:实现高效开发的选型策略
  • BAAI/bge-m3 WebUI 一键分析文本相似度
  • AI 工具泛滥时代,为何能力越来越不值钱?
  • 主流 AI 编程模型区别与高效开发选型指南
  • 数据结构:八种常见排序算法详解
  • Docker 运行 hello-world 镜像失败或超时问题排查
  • Copilot、Cursor、JetBrains 实战四场景:从测试到 CRUD 的关键写法
  • 基于 GLM-4.6V-Flash-WEB 的森林病虫害传播路径图像推断
  • 2026 Java 学习路线:核心、云原生与 AI 工程化实战
  • HTML 基础语法与常用标签详解
  • Docker部署OnlyOffice社区版,文档保存失败踩坑记录
  • VS Code 远程连接时 GitHub Copilot Chat 图标不显示问题修复
  • SHA-256 哈希验证工具解析与实现
  • 基于 YOLO11 的无人机航拍小目标检测实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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