【题目】
某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度不大于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; }
标签:拦截导弹,int,高度,系统,导弹,问题,拦截 From: https://www.cnblogs.com/End1ess/p/17600574.html