P1102 A-B 数对


这道题应该没法用双指针做,应为当i增大,j减小时A-B都是减小,我们可以将问题转化为A=B+C,
也就是当遍历到a【i】时求数组中有多少个数等于a【i】+c(最开始由于n和t取成一样的变量名了,导致卡了一会)
一下是二分查找的代码

#include<iostream>
#include<set>
#include<map>
#include<algorithm>
#define int long long
const int N = 1e6;
using namespace std;
int a[N];
int ans = 0;
int n;
int find(int t) {
	int begin1 = 1, end1 = n,p1=0;
	while (begin1 <= end1) {
		int mid = (begin1 -end1)/2+end1;
		if (a[mid] <= t) { 
			if (a[mid] == t)p1 = mid;//寻找右界
			begin1 = mid + 1; 
		}
		else end1 = mid - 1;
	}
	int begin2 = 1, end2 = n, p2 = 0;
	while (begin2 <= end2) {
		int mid = (begin2 + end2)/2;
		if (a[mid] < t)begin2 = mid + 1;
		else {
			if (a[mid] == t)p2 = mid;//寻找左界
			end2 = mid - 1;
		}
	}
	
	if (p1 != 0 && p2 != 0)return p1 - p2 + 1;//如果p1和p2等于零时说明没有找到目标数字
	else return 0;
}
signed main() {
	int c;
	cin >> n >> c;
	for (int i = 1; i <= n; i++)cin >> a[i];
	sort(a + 1, a + 1 + n);
	for (int i = 1; i <= n; i++) {
		ans += find(a[i] + c);
	}
	cout << ans;
	return 0;
}

第二种方法用map

#include<iostream>
#include<set>
#include<map>
#include<algorithm>
#define int long long
const int N = 1e6;
using namespace std;
int a[N];
int ans = 0;
int n,c;
map<int, int>m;//map<i,j>表示和c之和i的个数为j
signed main() {
	cin >> n >> c;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		auto it = m.find(a[i] + c);
		if (it == m.end())m.insert(pair<int, int>(a[i] + c, 1));
		else it->second += 1;
	}
	for (int i = 1; i <= n; i++) {
		auto it = m.find(a[i]);
		if (it != m.end())ans += it->second;
	}
	cout << ans;
	return 0;
}
posted @   郭轩均  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示