两个元素的和
作者:
小说家
,
2024-12-22 20:09:28
,
所有人可见
,
阅读 2
// Description
// 给定一个N(N<=50000)个int型整数的集合以及一个int型整数X, 问集合中是否存在两个元素的和等于X.
// Input
// 第一行输入M表示有M组测试. 每组测试首先输入N和X,接下来输入N个int型整数.
// Output
// 若否存在两个元素的和等于X则输出yes, 否则输出no.
// Sample Input
// 2
// 8 7
// 1 5 11 5 4 3 9 6
// 8 7
// 1 5 11 5 5 3 9 5
// Sample Output
// yes
// no
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main() {
int M; cin>>M;
while(M--){
int n, x;
cin >> n >> x;
unordered_map<int, int> ump; // 记录每个数出现的次数
vector<int> a(n);
bool has_find = false;
for (int i = 0; i < n; i++) {
cin >> a[i];
ump[a[i]]++; // 记录每个数出现的次数
}
for (int i = 0; i < n && !has_find; i++) { // 如果已经找到,就不需要继续循环了
int complement = x - a[i];
// 检查是否存在x-a[i],并且a[i]不等于x-a[i],且x-a[i]的数量不为0
if (ump.find(complement) != ump.end() && a[i] != complement && ump[complement] > 0) {
has_find = true;
break; // 找到一对数后即可退出循环
} else if (a[i] == complement && ump[a[i]] > 1) { // 如果a[i]等于x/2,并且它至少出现两次
has_find = true;
break; // 这种情况下也找到了一对数
}
ump[a[i]]--; // 减少当前数的计数,因为已经检查过它了
}
if (has_find) cout << "yes" << endl;
else cout << "no" << endl;
}
return 0;
}