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

二分算法实战:A-B 数对与烦恼的高考志愿

二分算法在 A-B 数对统计与高考志愿填报匹配中的应用。通过排序预处理,利用 lower_bound、upper_bound 或手动二分查找确定目标值位置。A-B 数对问题中枚举 A 并二分查找 B 的数量;高考志愿问题中寻找最接近录取分数的学校,需处理边界情况如所有分数大于或小于目标值。代码实现包含 C++ STL 函数使用及自定义二分逻辑,强调二段性与边界细节处理。

灵魂摆渡发布于 2026/3/21更新于 2026/6/221 浏览
二分算法实战: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 ,a + n);
    LL ret =;
    ( i =; i <= n; i++){
        LL b = a[i]- c;
        ret +=(a ,a + i ,b)-(a , a + i, b);
    }
    cout << ret << endl;
     ;
}
+1
+1
0
for
int
2
upper_bound
+1
+1
lower_bound
+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;
}

目录

  1. 一、A-B 数对
  2. 1.1 题目
  3. 1.2 算法原理
  4. 1.3 代码
  5. 二、烦恼的高考志愿
  6. 2.1 题目
  7. 2.2 算法原理
  8. 2.3 代码
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 基于任务辅助生成对抗网络(TA-GAN)增强光学纳米显微图像分辨率
  • 无线联邦学习:保护隐私的无线网络中 AI 协同进化
  • Python 脚本高效采集与分析手机操作日志
  • Windows 下 Python 工具 uv 安装后路径配置方法
  • Git-AI:追踪 AI 生成代码的开源扩展工具
  • Spring AI MCP Server 集成指南与源码剖析
  • FPGA 设计调试:Vivado ILA 高级触发模式配置
  • Llama 3.2 轻量化技术:修剪、蒸馏与移动端部署
  • 使用 Trae IDE 与 MCP Server 将 Figma 设计稿转为前端代码
  • C++ 使用 etcd-cpp-apiv3 搭建服务注册发现中心
  • Flutter inappwebview_cookie_manager 在鸿蒙系统下的适配与 Cookie 隔离实践
  • Vue 基础入门:核心设计思想深度拆解
  • Whisper-Large-V3-Turbo 模型高效部署指南
  • 前端 JS 调用后端 API 的三种常用方法
  • Java 包与导包机制及 Scanner 类输入源详解
  • HarmonyOS Next DevEco Studio 使用指南:添加 Ability 与服务卡片
  • iceoryx 附录:C++ 内存模型与原子操作详解
  • 基于 Z-Image-Turbo 构建图像生成 API 服务实战
  • WSL2 下 Webots 启动地址错误 10.255.255.254 的原因与修复
  • 迷宫最短路径:DFS 深度优先搜索实现

相关免费在线工具

  • 加密/解密文本

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