题意简述

有 $n$ 名学生, $a_i$ 为第 $i$ 名学生的能力值,一个团队中任意两队员的能力最大差值为5,求团队最多的学生人数。

$ $

思路很明显,先排序然后遍历队员,找到差值<=5长度的最大值。

考虑使用 $\texttt{two-pointers}$ ,排过序后长度只会向后延伸,也就是说如果 $a_1-a_5$ 区间内满足条件,那么 $a_2$ 为起点的区间只可能是 $a_2-a_n(n>=5)$

那么代码就很好写了

$ $

#pr\
agma GCC optimize(2)
#include <cstdio>
#include <algorithm>
using namespace std;

#define gcc getchar
template <typename T> inline void read(T&x)
{
    x=0; bool f=true; char ck=gcc();
    for( ; ck<'0'||ck>'9'; ck=gcc()) if(ck == '-') f=false;
    for( ; ck>='0'&&ck<='9'; ck=gcc()) x=(x<<1)+(x<<3)+(ck^48);
    x=f?x:-x; return ;
}

#define N 200003
int n, a[N], res;

int main(void)
{
    read(n);
    for(int i=1; i<=n; ++i) read(a[i]);
    sort(a+1, a+n+1);
    int j=1;    //指针起点,因为最少也能有1名学生参赛
    for(int i=1; i<=n; ++i)
        while(j <= n && a[j] <= a[i]+5)    //不断更新a[i]~a[j]区间长度
        {
            res=max(res, j-i+1);
            //从a[i]-a[j]的区间长度为j-i+1
            ++j;
        }
    printf("%d", res);
    return 0;
}