将能力值排序后,问题转化为“求最长的区间左右端点差不超过
的子数组长度”,双指针解决即可。
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
void solve(){
int n, k;
cin >> n >> k;
vector<int> nums(n + 5);
for (int i = 1; i <= n; i++) cin >> nums[i];
nums[n + 1] = 2e9 + 1;
sort(nums.begin() + 1, nums.begin() + 1 + n);
int l = 1, r = 1;
int ans = 0;
while (r <= n + 1) {
r++;
if (nums[r] - nums[l] > k) {
ans = max(ans, r - l);
while (nums[r] - nums[l] > k) l++;
}
}
cout << ans << endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _T = 1;
cin >> _T;
while (_T--){
solve();
}
return 0;
}

京公网安备 11010502036488号