5.拦截导弹问题

梦想是能睡八小时的猪 / 2023-08-02 / 原文

【题目】

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

输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统。

【输入】

n颗依次飞来的高度(1≤n≤1000)。

【输出】

要拦截所有导弹最小配备的系统数k。

【输入样例】

8

389 207 155 300 299 170 158 65

【输出样例】

2

 

【思路】

遍历每个数,用一个数组来保存一个系统中最后拦截导弹的高度,如果当前遍历的数要大于各个系统拦截的高度的话,那么就新建一个系统,将当前数存入,最后返回数组长度即可。

注意,遍历的数要存入末尾大于这个数的系统中,最小的那个(也就是第一个遇到的)

【代码】

public static int coupons(int[] h){
    //system[]数组表示所有子序列的结尾的最小值
    int[] system = new int[h.length];
    int num=0;
    for (int i = 0; i < n; i++) {
          int k =0;
          while(k<num&&system[k]<h[i]) k++;
          if(k==num) system[num++]=h[i]; //创建一个新的组
          else system[k]=h[i]; //加入原来的组,更新每个组结尾的最小值
        }
        return num;
}