P1102 A-B 数对

题目描述

给出一串正整数数列以及一个正整数 C,要求计算出所有满足 A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行。

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

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

输出格式

一行,表示该串正整数中包含的满足 A−B=C 的数对的个数。

输入输出样例

输入 

4 1
1 1 2 3

输出 

3

说明/提示

对于 75%的数据,1≤2000

对于 100% 的数据,1≤2×10^5,0≤ai​<2^30,1≤C<2^30。

其实很多解法,哈希、双指针……但有跟简单易懂的解法,记录出现次数,将A-B=C转换为A-C=B,就只需要记录a[i]的出现次数了。

AC代码:

//将A-B=C转换为A-C=B,记录A出现次数,输出A-C的出现次数
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
long long n, c, a[200005];//注意范围
map<long long, long long> m;//用map映射
int main(){
	cin >> n >> c;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		m[a[i]]++;//储存出现次数
	}
	long long ans = 0;
	for (int i = 1; i <= n; i++)
		ans += m[a[i] - c];//累加a[i]-c的出现次数
	cout << ans;//输出答案
	return 0;
}

代码就是这样了,哈希代码以后再补(大概可能吧)。

9月3号补:

//哈希代码,其实把map改成unordered_map就好了
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
long long n, c, a[200005];
unordered_map<long long, long long> m;//map的一种,内部为哈希表,作者较懒,所以使用unordered_map
int main(){
	cin >> n >> c;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		m[a[i]]++;
	}
	long long ans = 0;
	for (int i = 1; i <= n; i++) {
		ans += m[a[i]+c];
	}
	cout << ans;
	return 0;
}

unordered_map:

头文件:#include <unordered_map>

定义:unordered_map<索引类型,变量类型> 数组名称

优点:内部使用哈希表,查找速度快

缺点:建立时间长

map:建立时间短,内部使用红黑树(严格平衡二叉排序树),查找时间o(log n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值