zoukankan      html  css  js  c++  java
  • xdoj 1108 淼·诺贝尔

    此题的意思比较好理解,给定一堆数,他们有着特定的值,从中选出总数量最大的一堆数,使得两两之间对应值的差小于等于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;
    }
    
  • 相关阅读:
    4.JDBC技术
    3.MySQL数据库
    2.Oracle数据库
    (转载)Linux 套接字编程中的 5 个隐患
    一个Sqrt函数引发的血案
    二叉搜索树BinarySearchTree(C实现)
    vector,list.queue,array.....
    boost::Circular Buffer
    boost::operators
    Disjoint Sets
  • 原文地址:https://www.cnblogs.com/wickedpriest/p/3080836.html
Copyright © 2011-2022 走看看