题目描述

给一个有 个整数的数组 , 求两个数 使其和为

思路

先进行排序, 然后定义双指针 , 显然 变大时, 总和变大, 当 变小时, 总和变小。

因此就当总和 > 时, , 当 总和 < 时, 。等于时就输出。

代码

#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;
}