• 拦截导弹加强版(最长递增/减子序列加强版)


     拦截导弹加强版

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 49  解决: 14
    [提交][状态][讨论版][命题人:外部导入]

    题目描述

          某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

    输入

    第一行为一个整数N,表示飞来的导弹个数,N<=100000
    第二行为N个整数,依次表示导弹飞来的高度,高度数据为不大于30000的正整数。

    输出

    第一行,输出计算这套系统最多能拦截多少导弹
    第二行,输出要拦截所有导弹最少要配备多少套这种导弹拦截系统。

    样例输入

    8
    389 207 155 300 299 170 158 65

    样例输出

    6
    2

    提示

    最长不上升子序列、最长不下降子序列 

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cstdio>
    #include<algorithm>
    #include<stack>
    using namespace std;
    int n,m1,m2;  
    int a[100005],b[100005],c[100005];   
    int main()  
    {  
        int i,j;  
        scanf("%d",&n);  
        scanf("%d",&a[1]);  
        b[1]=c[1]=a[1];  
        m1=m2=1;  
        for(i=2;i<=n;i++)  
        {  
            bool f=0;
            scanf("%d",&a[i]);  
            for(j=1;j<=m1;j++)  
            {
                if(b[j]>=a[i])  
                {  
                    b[j]=a[i];  
                    f=1; break; 
                }  
            }
            if(!f)
            {
                b[++m1]=a[i];  
            }
    
            f=0;
    
            for(j=1;j<=m2;j++)  
            {
                if(c[j]<a[i])  
                {  
                    c[j]=a[i];  
                    f=1;
                    break; 
                }  
            }
            if(!f)
            {
                c[++m2]=a[i];    
            }
        }  
        printf("%d
    %d
    ",m2,m1);  
        return 0;  
    }  
  • 相关阅读:
    程序片段--2的乘方
    Set、Map集合、栈、队列
    Map迭代(六种)
    Struts2标签--控制标签
    线性表
    数据结构笔记(1)
    spingMVC问题小结
    《浪潮之巅》十四章笔记
    《浪潮之巅》十三章笔记
    《浪潮之巅》十二章笔记
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/9008119.html
Copyright © 2020-2023  润新知