试题描述
|
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000 的正整数),该导弹数量不超过100个计算这套系统最多能拦截多少导弹,和如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
|
输入
|
一行有若干个整数,表示依次飞来导弹的高度。两数之间用一个空格分隔。
|
输出
|
第一行一个数表示最多能拦截的导弹数 第二行一个数表示要拦截所有导弹最少要配备的系统数
|
输入示例
|
389 207 155 300 299 170 158 65
|
输出示例
|
6 2
|
其他说明
|
数据范围见题目中的描述。
|
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <cstdio> 2 #include <iostream> 3 #define MAXN 100 + 10 4 using namespace std; 5 int a[10010],b[10010],h[10010]; 6 int main() 7 { 8 //freopen(".in","r",stdin); 9 //freopen(".out","w",stdout); 10 int i=1,maxn,ans=0,num=0,n=0; 11 while(cin>>a[i]) 12 { 13 maxn=0; 14 for(int j=1;j<=i-1;j++) 15 if(a[j]>=a[i] && b[j]>maxn) 16 maxn=b[j]; 17 b[i]=maxn+1; 18 ans=max(b[i],ans); 19 int x=0; 20 for(int j=1;j<=num;j++) 21 if(h[j]>=a[i]) 22 if(x==0) 23 x=j; 24 else if(h[j]<h[x]) 25 x=j; 26 if(x==0) 27 { 28 num++; 29 x=num; 30 } 31 h[x]=a[i]; 32 i++; 33 } 34 cout<<ans<<endl<<num; 35 //system("pause"); 36 }