八叶一刀·无仞剑

万物流转,无中生有,有归于无

导航

xdoj 1108 淼·诺贝尔

Posted on 2013-05-15 22:11  闪之剑圣  阅读(201)  评论(0编辑  收藏  举报

此题的意思比较好理解,给定一堆数,他们有着特定的值,从中选出总数量最大的一堆数,使得两两之间对应值的差小于等于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;
}