#include<iostream>
#include<cstdio>
using namespace std;
const int N=1010;
int a[N];
int dp[N];
int n;
int store[N];
int ll=1,rr=1;
//左右指针记录有效数字范围
//每次开始之前,先添加哨兵
void HalfDivide(int t)
{
int l=ll-1;
store[l]=-0x3f3f3f3f;
int r=rr+1;
store[r]=0x3f3f3f3f;
while(l<r)
{
int mid=l+r>>1;
if(store[mid]>=t)
{
r=mid;
}
else
{
l=mid+1;
}
}
store[l]=t;
if(l==rr+1)
{
rr++;
}
}
//将数字t插入到store数组代表的一系列序列当中
int main()
{
int t;
while(cin>>t)
{
a[++n]=t;
}
dp[1]=1;
for(int i=2;i<=n;i++)
{
dp[i]=1;
for(int j=1;j<i;j++)
{
if(a[j]>=a[i])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,dp[i]);
cout<<ans<<endl;
//最多能拦截的导弹数
store[1]=a[1];
//最少需要配备的系统数
for(int i=2;i<=n;i++)
{
HalfDivide(a[i]);
}
cout<<rr<<endl;
}
AcWing算法提高课-拦截导弹
最新推荐文章于 2024-02-18 16:19:01 发布