【题解】P1102 A-B 数对

题目

出题是一件痛苦的事情!

相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!

好吧,题目是这样的:给出一串数以及一个数字 C,要求计算出所有 A - B = C的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式
输入共两行。

第一行,两个整数 N, C。

第二行,N 个整数,作为要求处理的那串数。

输出格式
一行,表示该串数中包含的满足 A - B = C的数对的个数。

输入输出样例
输入
4 1
1 1 2 3
输出
3

思路

如果一个一个地去试A-B=C,时间复杂度就是n^2,会超时
如果用数字来做下标呢?a[s]表示数字s出现的次数,要想找符合条件的a-b=c(s-b=c),直接加上a[s-b],再乘数字s出现的次数就行了
可是这样空间显然不够(所有输入数据都在 32 位带符号整数范围内)
map可以很好地解决这个问题

程序

#include<bits/stdc++.h>
using namespace std;
int n,c;
long long anss; //最后输出的答案要开long long,因为第三个测试点的数据范围已经超出了int 
map <long long ,long long> a; //a[数字s]=数字s出现的次数 
int main()
{
    
    
	scanf("%d%d",&n,&c);
	for (int i=1;i<=n;i++)
	{
    
    
		int s;
		cin>>s;
		a[s]++;
	}
	map<long long,long long>::iterator it;
	for (it=a.begin();it!=a.end();it++)
	  anss+=a[it->first-c]*it->second; 
	  //it->first代表a,it->first等价于a-c,也就是b,符合条件的b出现的次数就是满足a-c=b的数对的个数 
	  //后面还要乘 it->second是因为可能有多个a,就需要乘a的数目 
	cout<<anss<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45485187/article/details/108598216
A-B