A-B数对
题目描述
给出一串数以及一个数字 C,要求计算出所有 A - B = C的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个整数 N, C。
第二行,N 个整数,作为要求处理的那串数。
输出格式
一行,表示该串数中包含的满足 A - B = C的数对的个数。
输入
4 1
1 1 2 3
输出
3
该问题采用map映射解决
核心在于:从A-B=C转变为A-C=B, 理解映射。
第一步,用m[a[i]]++记录每一个数字a[i]出现的次数,
第二步,a[i] -= c。在a数列中,每一个数字A,减去C后,将会得到一个数字B。如果这个数字B依旧在原a数列中,那么就是我们要找的数字B了,我们就找到了一对A-B。再将B放入m[B],也就是m[a[i]],就得到了这对A-B的个数。(如果减去C后得到的B不在a数列中,那么m[B]就是0,因为一开始就m就没有记录这个数,放心从头到尾加m[a[i]])
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[200005], sum = 0;
map<LL,LL> m;//数字到数字出现次数的映射
int n, c;
int main()
{
cin>>n>>c;
for(int i = 1; i <= n; i++){
cin>>a[i];
m[a[i]]++;//记录数字出现的次数
a[i] -= c;//序列中的这个数减去C后,变成了一个B
}
for(int i = 1; i <= n; i++)
sum += m[a[i]]; //不要忘了此时a[i]是我们减C后的得到的B.
cout<<sum;
return 0;
}