天天看點

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;
}