此题的意思比较好理解,给定一堆数,他们有着特定的值,从中选出总数量最大的一堆数,使得两两之间对应值的差小于等于m。
由于此题的数量级比较大,达到十万级,因此不能利用简单的二层循环来实现。而应当首先对数据按照特定值进行排序,然后i从1到n进行遍历,i<=j,若j-i<=m,则继续,直到得到j-i>m为止,此时应当注意,j不必回溯,而是从刚才的位置继续往后遍历。原因我相信并不难理解,虽然我当时没有想到囧。
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
using std::sort;
long long number[100001];
int main()
{
int i,j,k,n,m,t,z;
scanf("%d",&t);
for(k=1;k<=t;k++)
{
long long max=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%lld",&number[i]);
sort(number+1,number+1+n);
for(i=1,z=i+1;i<=n;i++)
{
for(j=z;j<=n;j++)
{
if(number[j]-number[i]>m)
{
if(max<j-i)
max=j-i;
z=j;
break;
}
}
if(max<j-i)
{
max=j-i;
z=j;
}
}
printf("%lld\n",max);
}
return 0;
}
浙公网安备 33010602011771号