3030: 【普及-】【P1102】A-B 数对
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:21
解决:12
题目描述
给出一串正整数数列以及一个正整数 ,要求计算出所有满足 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入
输入共两行。
第一行,两个正整数 。
第二行, 个正整数,作为要求处理的那串数。
输出
一行,表示该串正整数中包含的满足 的数对的个数。
样例输入 复制
4 1
1 1 2 3
样例输出 复制
3
提示
对于 的数据,。
对于 的数据,,,。
分析:这回可以用map 更方便地完成。枚举每一个数A,想知道有多少个B满足 A-B=C,即有多少 B=A-C。有一种思路是建立一个很大的数组,下标就是这些数字,这样直接就可以查询到这个数字是否存在。但是由于值域非常大,若这么做的,则会造成内存超限。
凭借 STL,就可以使用这样的思路完成本题了。把每个数插人map里面,下标就是这些数字,值就是这些数字的个数。然后枚举A,查有多少B满足B等于 A-C 即可。
#include<bits/stdc++.h> using namespace std; #define MAXN 200010 map<int,int> ds; int a[MAXN],n,c; long long ans; int main(){ cin >> n >> c; for (int i=1; i<=n ; i++) cin >> a[i],ds[a[i]]++; //把每个元素加入map中,如果原先不存在默认初始值为0 for (int i=1; i<=n ; i++) ans +=ds[a[i] - c]; //对于每个A,查询有多少B满足 cout << ans << endl; return 0; }