• nyoj 214 单调递增子序列(二)



    单调递增子序列(二)

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
    描述

    给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。

    如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。

    输入
    有多组测试数据(<=7)
    每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。
    数据以EOF结束 。
    输入数据保证合法(全为int型整数)!
    输出
    对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。
    样例输入
    7
    1 9 10 5 11 2 13
    2
    2 -1
    样例输出
    5
    1


    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    int a[100002],b[100002];
    int erfen(int num,int len)//二分函数
    {
        int left,right,mid;
        left=1;
        right=len;
        mid=(left+right)/2;
        while(left<=right)
        {
            if(b[mid]<num)
                left=mid+1;
            else if(b[mid]>num)
                right=mid-1;
            else
                return mid;
            mid=(left+right)/2;
        }
        return left;
    }
    int main()
    {
        int n,len,i,j;
        while(scanf("%d",&n)!=EOF)
        {
            for(i=0; i<n; i++)
                scanf("%d",&a[i]);
            memset(b,0,sizeof(b));
            len=1;
            b[1]=a[0];
            a[0]=-1000000;
            for(i=1; i<n; i++)
            {
                j=erfen(a[i],len);
                b[j]=a[i];
                if(j>len)
                    len=j;
            }
            printf("%d
    ",len);
        }
        return 0;
    }
    
    
    
    //#include<stdio.h>
    //#include<string.h>
    //#include<algorithm>
    //using namespace std;
    //#define MAX 100010
    //#define IN -32767
    //int num[MAX];
    //int main()
    //{
    //    int n;
    //    while(scanf("%d",&n)!=EOF)
    //    {
    //        memset(num,0,sizeof(num));
    //        int l,r,mid,top=0,m;
    //        num[0]=IN;
    //        for(int i=0; i<n; i++)
    //        {
    //            scanf("%d",&m);
    //            if(m>num[top])
    //                num[++top]=m;
    //            else
    //            {
    //                l=1,r=top;
    //                while(l<=r)
    //                {
    //                    mid=(l+r)/2;
    //                    if(m>num[mid])
    //                        l=mid+1;
    //                    else
    //                        r=mid-1;
    //                }
    //                num[l]=m;
    //            }
    //        }
    //        printf("%d
    ",top);
    //    }
    //    return 0;
    //}
    

  • 相关阅读:
    学习java的第二天
    第一天学习JAVA
    java小知识字符串,比较object,equalsIgnoreCase()拼接concat /截取substring
    java小知识api Scanner Random ArrayList
    java小知识对象
    java小知识数组
    java小知识方法
    java基础知识循环语句
    java小知识语句
    java基础小知识
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/7264897.html
Copyright © 2020-2023  润新知