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

 拦截导弹加强版

时间限制: 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;  
}  
原文地址:https://www.cnblogs.com/caiyishuai/p/13271026.html