题目描述
给一个有 个整数的数组 , 求两个数 使其和为 。
思路
先进行排序, 然后定义双指针 , 显然 变大时, 总和变大, 当 变小时, 总和变小。
因此就当总和 > 时, , 当 总和 < 时, 。等于时就输出。
代码
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int N = 2e5 + 10;
int a[N];
int q[N], f[N];
void solve() {
int n,m;
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1);
for(int i = 1, j = n; i <= j; )
{
int sum = a[i] + a[j];
if(sum > m) j--;
else if(sum < m) i++;
else cout << a[i] << " " << a[j] << endl;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while(T--)
solve();
return 0;
}