题目背景
出题是一件痛苦的事情!
相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
题目描述
给出一串正整数数列以及一个正整数 C,要求计算出所有满足 A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个正整数 N,C。
第二行,N 个正整数,作为要求处理的那串数。
输出格式
一行,表示该串正整数中包含的满足 A−B=C 的数对的个数。
输入输出样例
输入#1
4 1
1 1 2 3
输出#1
3
说明/提示
对于 75% 的数据,1≤N≤2000。
对于 100% 的数据,1≤N≤2×105,0≤ai<2^30 , 1≤C<230。
2017/4/29 新添数据两组
思路
这道题使用暴力枚举的话只能得76分,有三个点会TLE。这道题最好的办法是用map保存每个数的个数,然后将数组排序后,每次判断ai+c就可以了。
首先我们是输入数组,然后用map来计数。
接着排序数组,这样可以减少时间复杂度。
然后遍历排序后的数组,用ans直接累加mp[a[i]+c],如果当前这个数有配对的数,直接加里面的值就行,如果不是也不用担心,因为map里面刚开始时是空的,加的只是0。
代码
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
const int N=1e6+10;
long long n,c,ans;
long long a[N];
map<long long,long long>mp;//一定要调long long,要不然会爆
int main()
{
cin>>n>>c;
for(int i=1;i<=n;i++)//基本输入
{
cin>>a[i];
mp[a[i]]++;//在map里面计数
}
sort(a+1,a+1+n);//排序
for(int i=1;i<=n;i++)
{
ans+=mp[a[i]+c];//增加答案,如果这个数有另一个数配对,就直接加那个数的map里的之即可
}
cout<<ans;//输出答案
return 0;
}
后记
点个赞吧!