当前位置: 首页 > news >正文

题解:洛谷 P1102 A-B 数对

【题目来源】

洛谷:P1102 A-B 数对 - 洛谷

【题目描述】

给出一串正整数数列以及一个正整数 \(C\),要求计算出所有满足 \(A-B=C\) 的数对的个数(不同位置的数字一样的数对算不同的数对)。

【输入】

输入共两行。

第一行,两个正整数 \(N,C\)

第二行,\(N\) 个正整数,作为要求处理的那串数。

【输出】

一行,表示该串正整数中包含的满足 \(A-B=C\) 的数对的个数。

【输入样例】

4 1
1 1 2 3

【输出样例】

3

【解题思路】

image

【算法标签】

《洛谷 P1102 A-B数对》 #模拟# #数学# #二分# #排序# #哈希,hash# #双指针,two-pointer#

【代码详解】

#include <bits/stdc++.h>
using namespace std;// 全局变量:
// n: 数组长度
// c: 目标差值
// a[200005]: 存储输入数组
// sum: 临时存储满足条件的元素个数
// ans: 存储最终结果(满足条件的对数)
int n, c, a[200005], sum;
long long ans = 0;/*** 二分查找左边界(第一个等于q的元素)* @param q 要查找的值* @return 第一个等于q的元素位置,未找到返回0*/
int findleft(int q)
{int l = 1, r = n + 1;while (l < r){int mid = l + (r - l) / 2;  // 防止溢出的中间值计算if (a[mid] >= q){r = mid;}else{l = mid + 1;}}if (a[l] == q){return l;}else{return 0;}
}/*** 二分查找右边界(最后一个等于q的元素)* @param q 要查找的值* @return 最后一个等于q的元素位置,未找到返回0*/
int findright(int q)
{int l = 1, r = n + 1;while (l < r){int mid = l + (r - l) / 2;if (a[mid] <= q){l = mid + 1;}else{r = mid;}}if (a[l - 1] == q){return l - 1;}else{return 0;}
}int main()
{// 输入数组长度和目标差值cin >> n >> c;// 输入数组元素for (int i = 1; i <= n; i++){cin >> a[i];}// 对数组进行排序sort(a + 1, a + n + 1);// 枚举每个元素作为B,查找满足A=B+c的元素for (int i = 1; i <= n; i++){int q = a[i] + c;  // 计算需要查找的值// 查找该值的左右边界if (findleft(q) == 0 && findright(q) == 0){sum = 0;  // 没有找到满足条件的元素}else{sum = findright(q) - findleft(q) + 1;  // 计算满足条件的元素个数}ans += sum;  // 累加到最终结果}// 输出满足条件的对数cout << ans << endl;return 0;
}
// 使用lower_bound和upper_bound重写一遍
#include <bits/stdc++.h>
using namespace std;// 全局变量:
// n: 数组元素个数
// c: 目标差值
// a[200005]: 存储数组元素
// sum: 临时变量(未使用)
// ans: 存储满足条件的元素对总数
int n, c, a[200005], sum;
long long ans = 0;int main()
{// 输入数组长度n和目标差值ccin >> n >> c;// 输入数组元素for (int i = 1; i <= n; i++){cin >> a[i];}// 对数组进行排序(升序)sort(a + 1, a + n + 1);// 遍历数组,统计满足a[j] = a[i] + c的元素对for (int i = 1; i <= n; i++){// 使用STL算法计算满足条件的元素个数:// upper_bound找到第一个大于a[i]+c的位置// lower_bound找到第一个不小于a[i]+c的位置// 两者相减即为等于a[i]+c的元素个数ans += upper_bound(a + 1, a + n + 1, a[i] + c) - lower_bound(a + 1, a + n + 1, a[i] + c);}// 输出满足条件的元素对总数cout << ans << endl;return 0;
}

【运行结果】

4 1
1 1 2 3
3
http://www.jsqmd.com/news/390083/

相关文章:

  • Smoke and Mirrors inspiration
  • 这个时间序列预测模型有点意思,直接上代码更直观。咱们先看看整个模型的架构长啥样
  • 题解:洛谷 P1678 烦恼的高考志愿
  • 行业内服务好的盒马鲜生礼品卡回收平台推荐 - 京顺回收
  • 题解:洛谷 P1024 [NOIP 2001 提高组] 一元三次方程求解
  • 题解:洛谷 P2249 【深基13.例1】查找
  • 信任就是最好的协作:openclaw的系统提示词分析
  • AI大模型高薪方向揭秘:大模型时代,小白也能弯道超车?高薪收藏帖+90天转型路线图免费领!
  • 大模型国家标准落地,大模型应用指南:小白也能掌握的金融科技新趋势,收藏学习必备!
  • 阿里通义千问团队揭秘Gated Attention,让你的大模型学习效率飙升,速收藏!
  • 从DeepSeek到Seedance2.0,大模型集体爆发!国产AI突然跃迁,小白也能轻松上车收藏!
  • 2026大学生转行,推荐一个好就业的方向——人工智能大模型,开启高薪就业新赛道!
  • 【Hot100-Java便捷】:两数之和 (Two Sum) —— 从暴力枚举到哈希表的思维跃迁
  • 键盘与鼠标:人机交互的奥秘深度解析:原理、实战与踩坑记录
  • OpenClaw怎么做到不串台、能并行、还总回对群 amp;#129302;✅(含源码解析)--OpenClaw系列第1期
  • GLM5.0发布:国产算力突破,大模型进化为智能工作系统,速来收藏学习!
  • AI产品经理转行大模型必读,央视都说AI大模型人才缺口大,为什么大家还是找不到工作?
  • Transformer大模型从入门到进阶:25+核心知识点解析(收藏版)
  • 2026主流电商小程序平台深度测评:功能优势与适用场景全解析
  • 论文阅读“EFFICIENT VISION-LANGUAGE-ACTION MODELS FOR EMBODIED MANIPULATION: A SYSTEMATIC SURVEY“
  • 【GitHub项目推荐--pySLAM:开源、模块化、可扩展的视觉SLAM框架】⭐⭐⭐⭐⭐
  • 当一家公司拥有37,000个智能体:科技投资公司企业AI治理实验
  • 在线图片压缩工具怎么选?几款免费好用的网站对比
  • 【GitHub项目推荐--ORB-SLAM2:开源实时视觉SLAM系统】
  • SpringBoot集成SpringAI与Ollama本地大模型
  • 深入解析:【开题答辩全过程】以 基于微信小程序的医疗物资进销存管理为例,包含答辩的问题和答案
  • 【Python】【机器学习】线性回归
  • 【Python】【机器学习】十大算法简介与应用
  • GitHub 热榜项目 - 日榜(2026-02-17)
  • 大模型开发 - 手写Manus之Sandbox执行代码:03 用Docker为AI Agent打造安全沙箱