拦截导弹

xiaoxiao2021-02-28  105

题目描述 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

这道题共两个小问,第一个小问实际是要我们求最长字串,而第二小问其实是要求最少递减序列的个数。第一小问用两个循环即可。而第二个小问如果用标记排除的方法难以实现,有些复杂,不可取。

第二个问题等价于求最长递增序列的元素个数。所以我们只需要在求最长递减序列时多加一步就可以了。

例如,一个全递增序列的最长递减序列有n个,长度为1;

而一个全递减序列的最长递增序列只有一个,长度为n;

#include<iostream> using namespace std; int main() { int missile[21],m1=1,m2=1,n=0,max1[20],max2[20],i,j; while(cin>>missile[n]) { max1[n]=1; max2[n]=1; n++; } for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(missile[j]<missile[i]) { max1[j]=max(max1[j],max1[i]+1); m1=max(m1,max1[j]); } else { max2[j]=max(max2[j],max2[i]+1); m2=max(m2,max2[j]); } } } cout<<m1<<endl; cout<<m2<<endl; return 0; }
转载请注明原文地址: https://www.6miu.com/read-61297.html

最新回复(0)