题目描述
某国为了防护敌国的导弹袭击,发展出一种导弹拦截系统。可是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹可以到达任意的高度,可是之后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。因为该系统还在试用阶段,因此只有一套系统,所以有可能不能拦截全部的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截多少导弹,若是要拦截全部导弹最少要配备多少套这种导弹拦截系统。
输入格式
1行,若干个整数(个数≤100000)
输出格式
2行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示若是要拦截全部导弹最少要配备多少套这种导弹拦截系统。
输入输出样例
输入
389 207 155 300 299 170 158 65
输出
6
2ios
#include<cstdio> #include<string.h> #include<iostream> using namespace std; const int maxn=300005; int aa[maxn]; int ff[maxn]; int main() { int n=0; int l,r,mid; while(scanf("%d",&aa[++n])!=EOF)continue; n--; ff[0]=9999999999; int ans1=0; for(int i=1;i<=n;i++){ if(ff[ans1]>=aa[i]){ ff[ans1+1]=aa[i];//结束点就为aa[i] ans1++; //当前最长不上升序列的长度加一 } else { l=0;r=ans1; while(l<r){ mid=(l+r)/2; if(ff[mid]>=aa[i])l=mid+1; else { r=mid; } } if(l!=0)ff[l]=aa[i]; } } cout<<ans1<<endl; memset(ff,-1,sizeof(ff)); int ans2=0; for(int i=1;i<=n;i++){ if(ff[ans2]<aa[i]){ ff[ans2+1]=aa[i]; ans2++; } else { l=0;r=ans2; while(l<r){ mid=(l+r)/2; if(ff[mid]>=aa[i])r=mid; else { l=mid+1; } } ff[l]=aa[i]; } } cout<<ans2<<endl;//输出第二个答案 }