题目背景
出题是一件痛苦的事情!
相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
题目描述
给出一串正整数数列以及一个正整数 C,要求计算出所有满足A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个正整数 N,C。
第二行,N 个正整数,作为要求处理的那串数。
说明/提示
对于 75%的数据,1≤N≤2000。
对于 100%100% 的数据,1≤N≤2×10^5,0≤ai<2^30,1≤C<2^30。
输出格式
一行,表示该串正整数中包含的满足 A−B=C 的数对的个数。
输入样例
4 1
1 1 2 3
输出样例
3
解题思路:
本题的数据量较大,通过双重循环暴力求解会造成超时,可以通过哈希表来求解。利用map容器存储每个数字出现的次数,随后遍历map数组(B),当B+C即A也在数组中时,通过二者数量乘积就可以得到这两个数字符合条件的数对数量,加到cnt中,最后输出cnt即可。
代码:
#include <iostream>
#include <map>
using namespace std;
int main()
{
int n, c, a;
long long int cnt=0;
cin >> n >> c;
map<long long int, long long int>num; // 存储每个整数出现的次数
for(int i=0; i<n; i++){
cin >> a;
num[a]++;
}
for(auto it = num.begin(); it != num.end(); it++){
if(num.find((*it).first+c)!=num.end())
cnt += num[(*it).first] * num[(*it).first+c];
}
cout << cnt << endl;
return 0;
}