zoukankan      html  css  js  c++  java
  • nyoj--214--单调递增子序列(二)(二分查找+LIS)

    单调递增子序列(二)

    时间限制: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_赵铭浩



    因为这道题只是求序列长度,所以每遇到一个比栈顶元素大的数,就放进栈里,遇到比栈顶元素小的就二分查找前边的元素,更新前边的元素,列一个数组自己模拟一下就好

    #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;
    }



  • 相关阅读:
    bash task list and interrupt
    bash字符串大小写转换方法
    Spectrum Mask
    OFDM中CP的优缺点
    模块边界使用寄存器来做数据的交互
    跨时钟域信号处理
    FPGA中一个Slice所含资源
    Verilog中if-else改写成case的方法
    同步序列的自相关与互相关
    TCP三次握手四次挥手
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273720.html
Copyright © 2011-2022 走看看