题面

链接
题意
给定一个数组,两个数组成一对和为k,要求在每对和相同的情况下,给出能组成的最大队数。
思路
先对数组排序,两个队员的和大于等于前两个的和,小于等于最后两个的和,在这个范围内枚举,利用双指针更新最大值即可。
AC代码
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 55;
int a[N];
int n;
int main()
{
int t;
for (cin >> t; t; t--)
{
cin >> n;
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
if (n >= 2 && n <= 3)
puts("1");
else if (n < 2)
puts("0");
else
{
int ans = 0;
sort(a, a + n);
int minn = a[0] + a[1], maxn = a[n - 2] + a[n - 1];
for (int i = minn; i <= maxn; i++)
{
int count = 0;
int l = 0, r = n - 1;
while (l < r)
{
if (a[l] + a[r] == i)
{
count++;
ans = max(ans, count);
l++, r--;
}
else if (a[l] + a[r] > i)
r--;
else
l++;
}
}
cout << ans << endl;
}
}
return 0;
}