牛客小白月赛24 B
这道题总的来说很简单
upper_lound(,,x):返回第一个大于x的数,在这道题中很有用
要求人数最多,一定是取一整段区间,所以考虑使用滑动窗口
解析:先把数组排序,我们需要取某一段,这一段的最大-最小<=k,关键是取哪一段。可以对于每个数,往后找,找到第一个减它>k的,这中间一段就满足了任意两个数之差<=k了。找的过程可以用upper_lound(,,x),它返回第一个大于x的数
#include<iostream>
#include<algorithm>
using namespace std;
#include<cmath>
const int maxn=2e5+10;
typedef long long ll;
ll n,k;
ll a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
ll ans = 0;
for(int i=0;i<n;i++)
{
ll md = upper_bound(a,a+n,a[i]+k)-a; //注意要减去a(数组名)才是下标
ans=max(ans,md-i); //不断更新那个滑动窗口
}
cout<<ans<<endl;
}
return 0;
}