尽管XL身处一维空间,但由于维度之刃,XL依然保持着高维度的状态,所以对他来说一维空间就是一条直线。来到这里之前,XL就知道在一维空间里存在着一种生物叫o,但是这些生物的生存空间似乎有限。如果把一维空间看作是一条数轴,那么这些生物只能生存在一个个整数点上。
由于XL保持着高维度的状态,他可以轻松得看到所有o,这时他提出了一个问题“假如有n只生物o,把他们所在的位置分别设为a1,a2,a3......,an,那么在找一段长为k的线段,这条线段里最多有多少只生物o?”
0 < n <= 10^5, 0 < k < ai <= 10^9
输入格式
第一行,两个整数n,k,表示一共有n个生物和长度
接下来n行,每行一个整数,表示第i个生物的位置
输出格式
一个整数,表示在一段长为k的线段里最多能有多少个生物
样例输入
10 5
1
2
3
4
5
6
7
8
9
10
样例输出
6
提示
注意,同一个位置可以有不止一只生物
在这个题里面我们能很容易发现有很鲜明的单调性,并且根据题意我们也能看出能用双指针。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <set>
using namespace std;
typedef long long ll;
int n, m, t, now, l, r, c, b, T, k;
const int INF = 0x3f3f3f3f;
const double pi = acos(-1.0);
int nx, ny, nz, ex, ey, ez;
ll mod = 1e9 + 7;
int sum[2022199];
void solve()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> sum[i];
}
sort(sum + 1, sum + 1 + n);//排序,防止原输入无序
sum[n + 1] = 2e9 + 1;//界定边界防止越界
int r = 1, l = n;//定义左指针和右指针的原始地方
int ans = 0;//
for (int i = 1; i <= n; i++)//遍历每一个节点
{
r = min(r, i);//最小最大好像都行
while (sum[r + 1] - sum[i] <= m)//双指针
{
r++;//r向右移动
}
ans = max(ans, r - i + 1);//找出最大值
}
cout << ans << endl;
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//cin >> n;
//while (n--)
//{
solve();
//}
return 0;
}