今天再一次体会到双指针的精妙之处,还是因为太菜了,哭了。
//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//统计了两次对数,最后结果除以2for(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;}
}