昨晚咕咕咕,看到队友Cwa了6发,来看看这道题
果不其然,不会写…
找到多个数对,使得数对的和相等。根据题意,数对和的范围为 2 ~ 2*n。
所以,我们可以针对数对的和先写一重循环。
得到数对和i之后,再写一重循环j去枚举所有物品,通过减法可以知道与当前物品配对的重量 i - a[j]。
所以,我们判断一下重量为 a[j],i - a[j] 的两个物品是否存在即可。
amazing,思维题真难搞
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
const int maxn = 100;
int a[maxn];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--)
{
map<int,int> m;
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
m[a[i]]++;
}
sort(a+1,a+1+n);
int ans = 0;
for(int i = 2; i <= 2*n; i++)
{
map<int,int> t = m;
// cout << t[6] << " " << t[8] << endl;
int sum = 0;
// cout << i << endl;
for(int j = 1; a[j] <= i && j <= n; j++)
{
if(t[i-a[j]] > 0 && i != a[j]*2 && t[a[j]] > 0)
{
sum++;
t[i-a[j]]--;
t[a[j]]--;
// cout << i-a[j] << " " << a[j] << endl;
}
else if(i == a[j] * 2 && t[a[j]] >= 2)
{
sum++;
t[i-a[j]]--;
t[a[j]]--;
// cout << i-a[j] << " " << a[j] << endl;
}
}
ans = max(ans,sum);
// cout << endl;
}
cout << ans << endl;
}
return 0;
}