题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000)
输出
输出有2行。
第1行是最多能拦截的导弹数,第2行是要拦截所有导弹最少要配备的系统数。
样例输入
389 207 155 300 299 170 158 65
样例输出
6 2
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[1000+5]={0};
int num=0;
while(cin>>a[num])num++;
int ans[1000+5];
ans[num]=a[0];
int len=num;
for(int i=1;i<num;i++)
{
if(a[i]<ans[len])
ans[--len]=a[i];
else
{
int p=lower_bound(ans,ans+num+1,a[i])-ans;
ans[p-1]=a[i];
}
}
cout<<num-len+1<<endl;
int t[1000+5]={a[0]};
int ta=1;
for(int i=1;i<num;i++)
{
int flag=-1;
for(int j=0;j<ta;j++)
{
if(a[i]<=t[j])
{
if(flag==-1)
flag=j;
if(flag>0&&t[flag]>t[j])
flag=j;
}
}
if(flag==-1)
{
t[ta++]=a[i];
}
else
t[flag]=a[i];
}
cout<<ta<<endl;
return 0;
}