牛客小白月赛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;
} 
 posted on 2020-04-21 16:51  My_serendipity  阅读(98)  评论(0编辑  收藏  举报