链接
思路
就是一个很基础的问题,可以转化为排序后极值差不超过5的序列的最大长度。
代码
解1
用尺取法,双指针当然是可以的啦
#include <cstdio>
#include <algorithm>
#include <cctype>
const int N = 2e5 + 10;
int n, a[N];
inline int read(){
int x = 0; char ch = getchar();
while (!isdigit(ch)){ch = getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48); ch = getchar();}
return x;
}
int main() {
n = read();
for (int i = 0; i < n; ++i) a[i] = read();
std::sort(a, a + n);
int l = 0, r = 0, ans = 1;
while (r < n - 1){
if (a[r + 1] - a[l] <= 5){
r++;
ans = std::max(ans, r - l + 1);
}else{
l++;
}
}
printf("%d\n", ans);
return 0;
}
解2
也可以用stl里面的队列模拟一下,两种解法的思路在本质上是一样的,而且时间也都是124ms。(实际上是不需要用deque的)
#include <cstdio>
#include <algorithm>
#include <cctype>
#include <queue>
const int N = 2e5 + 10;
int n, a[N];
inline int read(){
int x = 0; char ch = getchar();
while (!isdigit(ch)){ch = getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48); ch = getchar();}
return x;
}
int main() {
n = read();
for (int i = 0; i < n; ++i) a[i] = read();
std::sort(a, a + n);
int ans = 1;
std::deque<int> que;
for (int i = 0; i < n; ++i) {
que.push_back(a[i]);
while (que.back() > que.front() + 5)
que.pop_front();
ans = std::max(ans, (int)que.size());
}
printf("%d\n", ans);
return 0;
}