今天再一次体会到双指针的精妙之处,还是因为太菜了,哭了。
//Boats Competition 赛艇
//来源codeforses #1399c
//双指针:一个指针指向两个值的和,另一个指针指向其中一个值
//题中包含一个道理:a与b配对,现在假设有三个a,有两个b,那么就能构成两对组合
#include<bits/stdc++.h>
using namespace std;
map<int,int> m;
int main(){
int t,n,maxz=0;
cin>>t;
while(t--){
m.clear();
maxz=0;
cin>>n;
int w[n];
//存储每个值对应的个数
for(int i=0;i<n;i++){
cin>>w[i];
m[w[i]]++;
}
//双指针
//由于不能确定总和sum为多少时,构成的对数最多,由于数据范围很小,所以可以一个一个试
//又由于wi不超过50,所以可以直接从1遍历到50
//统计了两次对数,最后结果除以2
for(int i=2;i<=100;i++){
int s=0;
for(int j=1;j<=50;j++){
s+=min(m[j],m[i-j]);
}
maxz=max(maxz,s);
}
cout<<maxz/2<<endl;
}
}