成绩展示
题目描述
春季伴学挑战赛结束后,每个参与的同学都获得了一定的分数。现在想要挑选一些同学的成绩进行展示来进行激励。现在有N位同学获得了分数,并想在网站首页的两张轮播图中呈现一些同学的分数。
目前想要让轮播图中显示的分数尽可能接近,所以如果两个分数大小相差M以上的话,就不会出现在同一张轮播图中(如果分数大小差值正好为M,那么可以放在一张轮播图中)。现在给出N位同学的分数信息和M的大小,请你帮忙计算,最多一共可以放多少个学生信息在这两张轮播图中。
输入格式
第一行为两个整数N和M。
接下来N行整数xi 。代表学生分数。
输出格式
输出一个整数,表示最多一共可以放多少个学生信息。
样例 #1
样例输入 #1
7 3
10
5
1
12
9
5
14
样例输出 #1
5
#include <bits/stdc++.h>
using namespace std;
const int N=50005;
int a[N],lef[N],rig[N];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int L=1,R=1;
while(L<=R && R<=n)
{
while(a[R]-a[L]>m)
{
L++;
}
lef[R]=max(R-L+1,lef[R-1]);
R++;
}
L=n;
R=n;
while(L<=R && L>=1)
{
while(a[R]-a[L]>m)
{
R--;
}
rig[L]=max(R-L+1,rig[L+1]);
L--;
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(lef[i-1]+rig[i],ans);
}
printf("%d",ans);
return 0;
}