一、题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
二、输入格式
1行,若干个整数(个数≤100000)
三、输出格式
2行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
四、代码实现
#include<iostream>
#include<sstream>
#include<algorithm>
const int size = 1005;
using namespace std;
int cnt;
int arr[size],dp1[size], dp2[size];
stringstream ss;
int s2i(string str){
ss.clear();
ss << str;
int result;
ss >> result;
return result;
}
int main(){
string str,tmp;
getline(cin,str);
istringstream iss(str);
while(getline(iss,tmp,' ')){
arr[++cnt] = s2i(tmp);
}
int len1= 1,len2 = 1;
dp1[1] = dp2[1] = arr[1];
for(int i = 2; i <= cnt; i ++){
if(dp1[len1] >= arr[i]){
dp1[++len1] = arr[i];
}else{
int index = upper_bound(dp1+1,dp1+len1+1,arr[i],greater<int>()) - dp1;
dp1[index] = arr[i];
}
if(dp2[len2] < arr[i]){
dp2[++len2] = arr[i];
}else{
int index = lower_bound(dp2+1,dp2+len2+1,arr[i]) - dp2;
dp2[index] = arr[i];
}
}
cout << len1 << endl << len2 << endl;
}