解题思路

首先是对团队中的人的能力值进行排序,然后用尺取法两个forfor循环遍历一次能力值数组,时间复杂度为O(n)O(n)
一些需要注意的小细节:
1>多组数据输入,数组占用内存过大时定义成全局变量,读入前清零;
2>注意数据范围;
3>两次循环部分,外层的 ii 为左端点,即所选队员中能力值最低的标号,内层的 jj 为右端点,即所选队员中能力值最高的标号,维护 a[j]a[i]<=k a[j] - a[i] <= k,满足条件时 count++count++,不满足条件时判断是否需要更新 ansans,并且 countcount--(因为右端点不动,左端点右移,所选队员减少一位)。之后 breakbreak 掉内层循环,因为此时以 ii 为左端点的方案已经达到了极限状态,左端点需要右移。
特别注意:这里的 countcount--是无论是否更新 ansans,只要 a[j]a[i]>k a[j] - a[i] > k 都会执行的操作,因此不能写在判断语句范围内。

通过代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[200010];
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n;
        ll k;
        cin >> n >> k;
        memset(a, 0, sizeof(a));
        for (int i = 1; i <= n; i++)
            scanf("%lld", &a[i]);
        sort(a+1, a+n+1);
        ll count = 1, ans = 0;
        ll j = 2;
        for (ll i = 1; i <= n; i++)
        for (  ; j <= n; j++)
        {
            if (a[j] - a[i] <= k)  count++;
            else
            {
                if (count > ans)
                    ans = count;
                count--;
                break;
            }
        }
        cout << ans <<endl;
    }
    return 0;
}