导弹拦截
Description
某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试验阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
Input
输入数据只有一行,该行包含若干个数据,之间用半角逗号隔开,表示导弹依次飞来的高度(导弹最多有 20 枚,其高度为不大于 30000 的正整数)。
Output
输出数据只有一行,该行包含两个数据,之间用半角逗号隔开。第一个数据表示这套系统最多能拦截的导弹数;第二个数据表示若要拦截所有导弹至少要再添加多少套这样的系统。
Sample Input
389,207,155,300,299,170,158,65
Sample Output
6,1
上一篇博文的第二篇~就多了一个最长不上升(或不下降)子序列。并且在输入方面运用了 istringstream。具体看代码:
#include<cstdio> #include<iostream> #include<sstream> #include<string> using namespace std; int main(){ int a[25],b[25]={1},c[25]={0},x,n=0,cnt=0,maxnn=0; string s; getline(cin,s); for(int i=0;i<s.length();i++) if(s[i]==',') s[i]=' '; istringstream ss(s); while(ss>>x) a[n++]=x; for(int i=0;i<n;i++){ int maxn=0; for(int j=i-1;j>=0;j--) if(a[i]<=a[j]&&b[j]>maxn) maxn=b[j]; b[i]=maxn+1; } for(int i=0;i<n;i++){ for(int j=0;j<=cnt;j++){ if(a[i]<c[j]){ c[j]=a[i]; break; } else if(j==cnt){ cnt++; c[cnt]=a[i]; break; } } if(b[i]>maxnn) maxnn=b[i]; } printf("%d,%d\n",maxnn,cnt-1); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-08-10 02:19:59