题解 CF1133C 【Balanced Team】

Rbu_nas

2019-03-10 09:38:04

Solution

**题意简述** 有$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; } ```