题解 CF1133C 【Balanced Team】
Rbu_nas
2019-03-10 09:38:04
**题意简述**
有$n$名学生,$a_i$为第$i$名学生的能力值,一个团队中任意两队员的能力最大差值为5,求团队最多的学生人数。
$ $
思路很明显,先排序然后遍历队员,找到差值<=5长度的最大值。
考虑使用$\texttt{two-pointers}$,排过序后长度只会向后延伸,也就是说如果$a_1-a_5$区间内满足条件,那么$a_2$为起点的区间只可能是$a_2-a_n(n>=5)$
那么代码就很好写了
$ $
```cpp
#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;
}
```