zoukankan      html  css  js  c++  java
  • 导弹拦截(最长下降子序列)变形

    题目描述 Description

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

      

    输入描述 Input Description

    输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数)

      

    输出描述 Output Description

    输出这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

    样例输入 Sample Input

    389 207 155 300 299 170 158 65 

    样例输出 Sample Output

    6

    2

    数据范围及提示 Data Size & Hint

    导弹的高度<=30000,导弹个数<=20


    第一次看到要输出需要几套拦截系统时真是懵了。。半小时苦思无果,去食堂吃碗面回来的路上突然就顿悟了,几套设备不就是一个最长上升子序列问题吗,只要出现上升的高度,那前一个拦截状态必然无法成功拦截,想明白后,代码就很好写了,自己没深入考虑,现在只是把求最长下降子序列的代码粘贴过来改一下大小符号,这样显得有点暴力的味道,但是好在是一次AC过了,
         同时此题输入数字的个数不是预先给的,需要你写代码判断是否输入完毕,请教wwx大神后真是长知识啊!

       int num = 0;
        while(~scanf("%d", &a[num++])){} 

    这个凶残的写法居然就将问题迎刃而解,再次膜拜Orz(鄙人头大) 。未优化的代码就抛出来吧!


    #include <cstdio>
    
    #include <iostream>
    
    #include <algorithm>
    
    #include <memory.h>
    
    #include <cstring>
    
    #include <cmath>
    
    #include <ctype.h>
    
    #include <stack>
    
    #include <queue>
    
    #include <vector>
    
    #include <list>
    
    #include <set>
    
    using namespace std;
    
    
    int a[100],b[100];
    
    //int n=0;
    
    
    int main()
    
    {
    
    
        //scanf("%d",&n);
    
    //    for(int i=0;i<n;i++)
    
    //        scanf("%d",&a[i]);
    
        int num = 0;
    
        while(~scanf("%d", &a[num++])){}
    
        for(int i=0;i<100;i++)
    
            b[i]=1;
    
        int max1=1;
    
        int max;
    
        for(int i=0;i<num;i++)
    
        {
    
            max=0;
    
            for(int j=0;j<i;j++)
    
            {
    
                if(a[j]>a[i] && b[j]>max)
    
                    max=b[j];
    
            }
    
            b[i]=max+1;
    
            if(b[i]>max1)
    
                max1=b[i];
    
        }
    
        printf("%d
    ",max1-1);
    
        max1=1;
    
        for(int i=0;i<100;i++)
    
           b[i]=1;
    
        for(int i=0;i<num;i++)
    
        {
    
            max=0;
    
            for(int j=0;j<i;j++)
    
            {
    
                if(a[j]<a[i] && b[j]>max)
    
                    max=b[j];
    
            }
    
            b[i]=max+1;
    
            if(b[i]>max1)
    
                max1=b[i];
    
        }
    
        printf("%d
    ",max1);
    
    }

    用了两次输出,第一次输出后后面继续运行,得亏数据量不大,要是大了非得超时,,,,待优化。。

  • 相关阅读:
    SpringBoot统一全局响应(5)
    SpringBoot统一异常处理(4)
    Spring Cloud Alibaba-Gateway搭配Nacos实现动态路由(4)
    SpringBoot使用javax.validation进行参数校验(3)
    SpringBoot使用日志(2)
    WPF 之 ObservableCollection 动态数据集合的使用(二)
    WPF 之 INotifyPropertyChanged 接口的使用 (一)
    数据库访问框架 Chloe
    Navicat Premium 的破解安装教程
    C#定位文件位置并修改字节数据
  • 原文地址:https://www.cnblogs.com/emoji/p/4436796.html
Copyright © 2011-2022 走看看