zoukankan      html  css  js  c++  java
  • 8-导弹拦截一(n^2 and nlogn)

    /*某国为了防御敌国的导弹袭击,研发出一套导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发拦截
    炮弹能够到达任意的高度,但是以后每一发拦截炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的多枚导弹来
    袭。
    /
    输入描述

    输入的第一行为导弹的个数n (0<n<10000),接下来的一行为导弹依次飞来的高度h(不大于
    30000 的正整数)

    输出描述
    输出最多拦截的导弹个数。
    输入样例
    6
    5 3 2 4 1 3
    输出样例
    4*/
     1. n^2的
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int b[305];
    int n, a[3005], sum = 0;
    int dp[305];

    int main(){
        int j = 0, min;
        cin >> n;
        
        for(int i = 0; i < n; i++)
            cin >> a[i];
        for(int i = 1; i < n; i++){
            dp[0] = 1;
            for(int j = 0; j < i; j++){
                if(a[j] <= a[i] && dp[j] + 1 > dp[i]){
    //                b[i] = a[j];
                    dp[i] = dp[j] + 1;    
                }
            }
    //        cout << b[i] << " ";
    //        cout << dp[i] << " ";
        }
        min = dp[0];
        for(int i = 1; i < n; i++)
            if(min < dp[i])
                min = dp[i];
        cout << min;
        return 0;
    }

    2.下面是nlogn

    #include <iostream>
    using namespace std;

    int search(int s, int *g, int low, int high){
        int mid = 1;
        while(low < high){
            mid = (low + high) / 2;
            if(g[mid] <= s)
                low = mid + 1;
            else
                high = mid;
        }
        return low;
    }

    int main(){
        int g[305], a[305], n;
        cin >> n;
        
        for(int i = 0; i < n; ++i)
            cin >> a[i];
        g[1] = a[0];
        int len = 1, j = 0;
        for(int i = 1; i < n; i++){
            if(g[len] < a[i])     //如果a[i]比g的最后一个数组小就直接插在后面
                j = ++len;
            else                                
    //            j = search(a[i], g, 1, ++len);   // (注意:这种情况长度不变,不能写成++len)
                j = search(a[i], g, 1, len + 1); //  否则就插在g中比a[i]大的数中最小的那个数的位置即替换他
            g[j] = a[i];                         //用二分找的插入的位置                                
    //        cout << j << " "; //打印的是每次a[i]加入g 数组的位置(从1开始存入的)
        }
        cout << len;
        return 0;
    }

  • 相关阅读:
    Linux下查看网卡驱动和版本信息
    HTML <!--...--> 标签
    linux物理网卡检测命令mii-tool
    Git错误non-fast-forward后的冲突解决
    ubuntu上解决访问github慢的方法
    右侧添加悬浮打赏功能
    VSCode 预览 .md 文件
    Matlab绘制三维曲面(以二维高斯函数为例)
    matlab的三维绘图和四维绘图
    ubuntu查看文件和文件夹大小
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7306522.html
Copyright © 2011-2022 走看看