某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入格式 Input Format
输入导弹依次飞来的高度(导弹数最多不超过20枚,雷达给出的高度数据是不大于30000的正整数)
输出格式 Output Format
计算这套系统最多能拦截多少导弹
如果要拦截所有导弹最少要配备多少套这种导弹拦截系统
样例输入
389 207 155 300 299 170 158 65
样例输出
输入格式 Input Format
输入导弹依次飞来的高度(导弹数最多不超过20枚,雷达给出的高度数据是不大于30000的正整数)
输出格式 Output Format
计算这套系统最多能拦截多少导弹
如果要拦截所有导弹最少要配备多少套这种导弹拦截系统
样例输入
389 207 155 300 299 170 158 65
样例输出
6
思路见注释
#include <iostream>
#define N 20
using namespace std;
int fintfirst(int *a,int n,int k)
{
for(int i=0;i<n;i++)
if(a[i]>=k)
return i;
return n;
}
int main()
{
int a[N];
int l[N];
int n;
cin>>n;
cin>>a[0];
l[0]=1;
for(int i=1;i<n;i++)
{
cin>>a[i];
int max=0;
for(int j=0;j<i;j++)
if(a[i]<=a[j]&&l[j]>max)
max=l[j];
l[i]=max+1;
}
int posmin[N];//用以记录每个非递增序列的最小元素
int persize=1;//当前非递增子序列的个数
posmin[0]=a[0];
for(int i=1;i<n;i++)
{
/*
如果现在这个高度比所有非递增子序列的最小元素都大
责说明应该增加一套系统
如果可以加在一个序列后面则更新
*/
int m=fintfirst(posmin,persize,a[i]);
if(m==persize)
persize++;
posmin[m]=a[i];
}
cout<<l[n-1]<<endl;
cout<<persize<<endl;
return 0;
}