天天看点

C. Boats Competition

题面

C. Boats Competition
C. Boats Competition

链接

题意

给定一个数组,两个数组成一对和为k,要求在每对和相同的情况下,给出能组成的最大队数。

思路

先对数组排序,两个队员的和大于等于前两个的和,小于等于最后两个的和,在这个范围内枚举,利用双指针更新最大值即可。

AC代码

#include <algorithm>
#include <iostream>

using namespace std;

const int N = 55;
int a[N];
int n;

int main()
{
    int t;
    for (cin >> t; t; t--)
    {
        cin >> n;
        for (int i = 0; i < n; i++)
            scanf("%d", &a[i]);
        if (n >= 2 && n <= 3)
            puts("1");
        else if (n < 2)
            puts("0");
        else
        {
            int ans = 0;
            sort(a, a + n);
            int minn = a[0] + a[1], maxn = a[n - 2] + a[n - 1];
            for (int i = minn; i <= maxn; i++) 
            {
                int count = 0;
                int l = 0, r = n - 1;
                while (l < r)
                {
                    if (a[l] + a[r] == i)
                    {
                        count++;
                        ans = max(ans, count);
                        l++, r--;
                    }
                    else if (a[l] + a[r] > i)
                        r--;
                    else
                        l++;
                }
            }
            cout << ans << endl;
        }
    }
    return 0;
}