传送门
题意:给你含n个数字的数组,可以任意两两相加,问你最多有多少对数字的和可以是同一个数字(一个数字不可以重复使用)
分析:范围小,可以使用暴力;如果满足条件,每个数字只可以使用一次,所以可以遍历相加的和,然后排序后,头和尾作为双指针相加,不满足条件就朝着接近满足的方向转移;注意指针的转移是转移之前没有转移过的指针,如两数的和小了,左指针变大,右指针变大就又回去了
ac代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int inf=0x3f3f3f3f;
int a[110];
int main()
{
int t,maxx,n,l,r,ans;
cin>>t;
while(t--)
{
maxx=-inf;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
for(int i=2;i<=2*a[n];i++)
{
l=1;
r=n;
ans=0;
while(l<r)
{
if(a[l]+a[r]==i)
{
ans++;
l++;
r--;
}
else if( a[l]+a[r]<i )//如果和小了,左指针右移
l++;
else if( a[l]+a[r]>i )//和大了,右指针左移
r--;
}
maxx=max(ans,maxx);
}
cout<<maxx<<endl;
}
}