zoukankan      html  css  js  c++  java
  • nyoj_214_单调递增子序列(二)_201403182131

     

    单调递增子序列(二)

    时间限制: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
    来源
    [521521]改编
    上传者
    ACM_赵铭浩
     
     1 #include <stdio.h>
     2 #include <string.h>
     3 int s[100010];
     4 int longest[100010];
     5 int main()
     6 {
     7     int m;
     8     while(scanf("%d",&m)!=EOF)
     9     {
    10         int i,j,max;
    11         for(i=0;i<m;i++)
    12         scanf("%d",&s[i]);
    13         for(i=0;i<m;i++)
    14         longest[i]=1;
    15         for(j=1;j<m;j++)
    16         {
    17             for(i=0;i<j;i++)
    18             if(s[j]>s[i]&&(longest[j]<longest[i]+1))
    19             longest[j]=longest[i]+1;
    20         }
    21         max=longest[0];
    22         for(i=0;i<m;i++)
    23         if(longest[i]>max)
    24         max=longest[i];
    25         printf("%d
    ",max);
    26     }
    27     return 0;
    28 }
    29 //TML
    View Code

    //TML

     1 #include <stdio.h>
     2 #include <string.h>
     3 int s[100010];
     4 int b[100010];
     5 int f(int a,int w)
     6 {
     7     int left,right,mid;
     8     left=0;right=a-1;
     9     while(left<=right)
    10     {
    11         mid=(left+right)/2;
    12         if(b[mid]>w)
    13         right=mid-1;
    14         else if(b[mid]<w)
    15         left=mid+1;
    16         else//找到了该元素,则直接返回
    17         return mid;
    18     }
    19     return left;//数组b中不存在该元素,则返回该元素应该插入的位置
    20 }
    21 int main()
    22 {
    23     int m;
    24     while(scanf("%d",&m)!=EOF)
    25     {
    26         int i,j,len;
    27         for(i=0;i<m;i++)
    28         scanf("%d",&s[i]);
    29         len=1;b[0]=s[0];
    30         for(i=1;i<m;i++)
    31         {
    32             if(s[i]>b[len-1])
    33             b[len++]=s[i];//如果大于B中最大的元素,则直接插入到B数组末尾
    34             else
    35             b[f(len,s[i])]=s[i]; //二分查找需要插入的位置
    36         }
    37         printf("%d
    ",len);
    38     }
    39     return 0;
    40 }
    41 //O(logN)求最长递增子序列 

    //AC

  • 相关阅读:
    软件建模之UML图形讲解
    Android中级第八讲安卓子线程,以及定时任务使用讲解
    有你同行,我不会寂寞物联网操作系统Hello China后续开发计划及开发者征集
    物联网操作系统再思考Hello China操作系统的运营商网络协同机制
    Windows Phone 7 Storage
    Silverlight &Windows phone7 中使用Isolated Storage存储与读取图片
    Windows Phone7的Pivot控件简介
    windowsphone7的启动器和选择器
    如何将App的图标放到起始页面
    WebBrowser控件用法总结
  • 原文地址:https://www.cnblogs.com/xl1027515989/p/3608815.html
Copyright © 2011-2022 走看看