A-B 数对(洛谷)

A-B 数对

题目背景
出题是一件痛苦的事情!
相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
题目描述
给出一串正整数数列以及一个正整数 C,要求计算出所有满足 A - B = C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个正整数 N,C。
第二行,N 个正整数,作为要求处理的那串数。
输出格式
一行,表示该串正整数中包含的满足 A - B = C 的数对的个数。
样例 #1
样例输入 #1

4 1
1 1 2 3

样例输出 #1

3

提示
对于 75% 的数据,1 <= N <= 2000。
对于 100% 的数据,1 <= N <= 2*105,0 <=ai <230,1 <= C < 230

代码

#include<bits/stdc++.h>
using namespace std;// 数组b用于存储输入的正整数序列
int b[1000000];
// n用于存储正整数序列的长度
int n;// 快速排序函数,用于将数组b的[l, r]区间内的元素进行升序排列
void quick_sort(int b[], int l, int r)
{// 如果l大于等于r,说明区间没有元素或者只有一个元素,不需要排序,直接返回if(l >= r) return;// 初始化双指针i、j和基准值xint i = l - 1, j = r + 1, x = b[l + r >> 1];// 分区操作while(i < j){// 移动左指针,找到第一个大于等于基准值的元素do i++; while(b[i] < x);// 移动右指针,找到第一个小于等于基准值的元素do j--; while(b[j] > x);// 如果左右指针没有相遇,交换元素if(i < j) swap(b[i], b[j]);}// 对左半部分递归排序quick_sort(b, l, j);// 对右半部分递归排序quick_sort(b, j + 1, r);
}// 归并排序函数,用于将数组b的[l, r]区间内的元素进行升序排列
void merge_sort(int b[], int l, int r)
{// 如果l大于等于r,不需要排序if(l >= r) return;// 计算中点int mid = l + r >> 1;// 递归排序左半部分merge_sort(b, l, mid);// 递归排序右半部分merge_sort(b, mid + 1, r);// 合并两个有序数组int k = 0, i = l, j = mid + 1;while(i <= mid && j <= r){if(b[i] <= b[j]) tmp[k++] = b[i++];else tmp[k++] = b[j++];}// 将剩余的元素添加到tmp数组中while(i <= mid) tmp[k++] = b[i++];while(j <= r) tmp[k++] = b[j++];// 将合并后的数组复制回原数组for(i = l, j = 0; i <= r; i++, j++) b[i] = tmp[j];
}// 查找函数find1,用于在数组b中找到第一个大于等于a的元素的索引
int find1(int a)
{int l = 0, r = n - 1;while(l < r){int mid = l + r >> 1;if(b[mid] >= a) r = mid;else l = mid + 1;}if(b[l] == a) return l;return -1;
}// 查找函数find2,用于在数组b中找到最后一个小于等于a的元素的索引
int find2(int a)
{int l = 0, r = n - 1;while(l < r){int mid = l + r + 1 >> 1;if(b[mid] <= a) l = mid;else r = mid - 1;}if(b[r] == a) return r;return -1;
}// 主函数
int main()
{// 读入正整数序列的长度n和差值cint c;cin >> n >> c;// count用于统计满足条件的数对个数long long count = 0;//int会爆范围 int i;// 读入序列到数组bfor(i = 0; i < n; i++)cin >> b[i];// 对数组b进行快速排序quick_sort(b, 0, n - 1);// 下面的merge_sort函数被注释掉了,选择快速排序进行实际的排序操作// merge_sort(b, 0, n - 1);// 遍历数组b,寻找满足条件的数对for(i = 0; i < n; i++)//枚举B的下标,使得A-B=C,变为A=B+C {int a = b[i] + c;int res1 = find1(a); // 查找满足条件的A的起始索引if(res1 == -1) // 如果没有找到满足条件的A,继续下一轮循环continue;else{int res2 = find2(a); // 查找满足条件的A的结束索引count += res2 - res1 + 1; // 将找到的A的数量累加到count中}}// 输出满足条件的数对个数cout << count << endl;return 0;
}

部分代码解析

  当我们查找满足 A - B = C 的数对时,一旦确定了一个B的值,我们就需要找到所有可能的A的值。在排序后的数组中,A的值必须是B+C。函数find1找到了第一个等于A的元素的位置(也就是最小的索引),而函数find2找到了最后一个等于A的元素的位置(也就是最大的索引)。

  例如,假设我们有以下排序后的数组a:

  a = [1, 2, 3, 3, 4, 5, 6]

  我们要找到所有满足 A - B = C 的数对,给定 C = 1。如果我们选择 B = 2(即a[1]),那么 A 应该等于 3(即 B + C = 2 + 1)。
  现在我们使用find1在数组a中找到值为A=3的第一个位置,假设是a[2]。然后,我们使用find2找到值为A=3的最后一个位置,假设是a[3]。这意味着在数组a的索引2和3处,元素的值都是3。

  a[2] = 3
  a[3] = 3

  所以,对于 B = 2,我们找到了两个满足条件的A。因此,对于这个B,满足 A - B = C 的数对的数量是:

  res2 - res1 + 1 = 3 - 2 + 1 = 2

  这样我们就计算出了从起始位置到结束位置所有满足条件的A的数量。这个计算过程对每一个可能的B值都要重复执行,然后把所有找到的数量累加到count中,最终得到满足条件的总数对数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运筹说 第90期 | 网络计划-图解评审法

前述章节的网络计划方法主要研究以时间为主要参数的确定型网络模型&#xff0c;其中的概率型网络模型也只讨论工作公式的不确定性&#xff0c;并没有对事项或工作的不确定性进行讨论。由于这类网络模型的建立有严格的规则&#xff0c;大量研究与开发类计划尚无法表达。因从本期…

vue中el-radio无法默认选中

页面上不生效&#xff0c;默认什么都不选中 <el-radio-group v-model"queryParams.videoUrlType"><el-radio :label"1">本地上传</el-radio><el-radio :label"2">外部链接</el-radio> </el-radio-group>da…

污水处理厂能耗分析系统,高效节能保护环境的利器

在城市化发展中&#xff0c;水污染问题也愈发凸显&#xff0c;在污水处理过程中&#xff0c;所产生的能源相对较多&#xff0c;企能源消耗的量就比较大&#xff0c;所以成本就会较高。因此&#xff0c;应对污水处理的具体情况需要进行深入分析与研究&#xff0c;明确具体消耗情…

Lamp架构从入门到精通

系列文章目录 lnmp架构 lnmp架构-nginx负载均衡以及高可用 系列文章目录一、源码编译configure(检测预编译环境是否可行)makemake install优化关闭Debug 二、 nginx负载均衡三、nginx的高并发nginx work数量的设定nginx work进程与cpu的静态绑定压力测试nginx高并发修改操作系…

使用 Apache POI XDGF 读取 vsdx 文件

引入依赖 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.22.1</version> </dependency> <dependency><groupId>org.apache.logging.log4j</groupI…

org.openjdk.jmh 的 pom 引用

<dependencies><dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.29</version></dependency> </dependencies>这将从 Maven 中央存储库下载 org.openjdk.jmh 依赖项的…

Spring AOP 源码分析

【阅读前提】&#xff1a; 需了解AOP注解开发流程&#xff1a;链接 一、注解 EnableAspectJAutoProxy 在配置类中添加注解EnableAspectJAutoProxy&#xff0c;便开启了AOP&#xff08;面向切面编程&#xff09; 功能。此注解也是了解AOP源码的入口。 EnableAspectJAutoProxy…

训练营第四十九天 | ● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 持有&#xff1a;第i-1天持有&#xff1b;第i天买入 不持有&#xff1a;第i-1天不持有&#xff1b;第i天卖出 代码随想录 class Solution {public int maxProfit(int[] prices) {//动态规划if(prices null || prices.length 0) return 0;int n pri…

编码技巧:如何在Golang中高效解析和生成XML

编码技巧&#xff1a;如何在Golang中高效解析和生成XML 引言Golang中的XML基础解析XML文件生成XML文件错误处理和调试高级技巧和最佳实践总结 引言 在当今数据驱动的编程世界中&#xff0c;有效地处理各种数据格式是每个开发人员必备的技能之一。其中&#xff0c;XML&#xff…

【人工智能:现代方法】第19章:样例学习

智能体学习&#xff08;learning&#xff09;&#xff1a;一个智能体通过对世界进行观测来提高它的性能机器学习&#xff08;machine learning&#xff09;&#xff1a;智能体是一台计算机 —— 一台计算机观测到一些数据&#xff0c;基于这些数据构建一个模型&#xff08;mode…

并发编程之三大特性及JMM内存模型

目录 原子性 如何保证原子性 可见性 如何保证可见性 有序性 如何保证有序性 Java内存模型(JMM内存模型) Java内存模型的一些关键概念&#xff1a; 主内存与工作内存交互协议 Java内存模型通过以下手段来确保多线程程序的正确性&#xff1a; 锁机制 volatile volat…

说说JavaScript数字精度丢失的问题,如何解决?

在 JavaScript 中&#xff0c;数字精度丢失是一种普遍的问题。这是因为 JavaScript 内部的数字均以 IEEE 754 标准的双精度浮点数格式存储&#xff0c;这种格式只能精确表示有限个小数&#xff0c;而对于一些无限循环小数或无理数&#xff0c;无法精确表示&#xff0c;就会出现…

1-数组-有效的数独

这是数组的第一题&#xff0c;从现在开始开启数组篇章。力扣链接。 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的…

Fpga开发笔记(二):高云FPGA发开发软件Gowin和高云fpga基本开发过程

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135620590 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

【Redis配置】Linux下的Redis安装配置

压缩包方式的Redis下载与安装 进入官网 Redis官网&#xff1a;https://redis.io/download/ 往下翻可以找到其他版本的Redis&#xff0c;或者访问https://download.redis.io/releases/查找自己所需Redis版本。 下载自己所需版本 此处我选择下载的是6.2.14版本 上传到Linux…

墙地砖外形检测的技术方案-图像分割

基础原理 由于对碗口进行缺口检测&#xff0c;因此只需要碗口的边界信息。得到陶瓷碗区域填充后的图像&#xff0c;对图像进行边缘检测。这是属于图像分割中的内容&#xff0c;在图像的边缘中&#xff0c;可以利用导数算子对数字图像求差分&#xff0c;将边缘提取出来。 案例…

Vue:将以往的JQ页面,重构成Vue组件页面(组件化编码大致流程)

一、实现静态组件 组件要按照功能点拆分&#xff0c;命名不要与HTML元素冲突。 1、根据UI提供的原型图&#xff0c;进行结构设计&#xff0c;结构设计的粒度以是否方便给组件起名字为依据。并梳理好对应组件的层级依赖关系。 2、设计好结构后&#xff0c;开始写对应的组件&am…

pl/sql程序块的使用

-- Created on 2024-01-15 by ADMINISTRATOR declare -- Local variables hererecord_tablename varchar2(100);---test_record表名record_StartNo integer(19);---test_record开始编号temp_No integer(19);maxnbbh integer(19);nCnt integer : 20;fi…

ESP32 带字库显示中文终极方案

在持续的试错和进步之间发布过下面内容&#xff1a; TFT屏幕在arduino &#xff08;esp 32&#xff09;下的驱动&#xff0c;汉字显示和字库比较_arduino gc9a01显示汉字-CSDN博客 在esp32(esp8266) 提供软字库显示中文的解决方案_tft_espi汉字-CSDN博客 单片机上软字库换32进…

jar包热加载原理

第一次加载时&#xff0c;记录jar包的更新时间 lastModified jarLoader.getURLs()[0].openConnection().getLastModified(); 第二次加载时&#xff0c;比较jar的更新时间和第一次jar包更新时间&#xff0c;若不一致&#xff0c;说明jar包更新过了 if (jarLoader.getLastModi…