题目链接: Boats Competition
大致题意:
给定n个数构成的数组, 让我们自定义一个数s, 使得对于任选ai与aj(i≠j), 满足ai+aj=s的组合尽可能多.
解题思路:
由于本题数据较小, n最大只有50, wi最大也只有50, 所以s最大不会超过100. 我们不妨枚举出每种s的取值, 然后看看对于当前s值有多少种组合, 结果取最大即可.
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1E2 + 10;
int a[N], b[N]; //a数组存放n个数据(可以不要), b数组存放为x的值有多少个
int main()
{
int t; cin >> t;
while (t--) {
memset(b, 0, sizeof b);
int n; cin >> n;
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]), b[a[i]]++;
int res = 0;
for (int k = 2; k <= 2 * n; ++k) {
int cou = 0; //s=k时的结果数量
for (int i = 1; i <= k / 2; ++i) { //避免重复只枚举前一半即可
if (b[i] && b[k - i] && i != k - i) { //要避免取到相同的数字情况
int temp = min(b[i], b[k - i]);
cou += temp;
}
}
if ((k & 1) == 0) cou += b[k >> 1] >> 1; //是偶数, 可能由相同数字组成
res = max(res, cou);
}
cout << res << endl;
}
return 0;
}