1040.导弹拦截
Time Limit: 1000 MS Memory Limit: 32768 KB
Description
某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试验阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
Input
输入数据只有一行,该行包含若干个数据,之间用半角逗号隔开,表示导弹依次飞来的高度(导弹最多有 20 枚,其高度为不大于 30000 的正整数)。
Output
输出数据只有一行,该行包含两个数据,之间用半角逗号隔开。第一个数据表示这套系统最多能拦截的导弹数;第二个数据表示若要拦截所有导弹至少要再添加多少套这样的系统。
Sample Input
389,207,155,300,299,170,158,65
Sample Output
6,1
#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; }