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