这个题其实就是求最长下降序列,我反向求的最长上升序列,用N*log(n)解决
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10001;
const int inf=1<<28;
int a[maxn],g[maxn];
int main()
{
int cas=1;
while(scanf("%d",&a[0])&&a[0]!=-1)
{
int cur=1;
while(1)
{
scanf("%d",&a[cur]);
if(a[cur]==-1)
break;
cur++;
}
for(int i=1;i<maxn;i++)
g[i]=inf;
int ans=0;
for(int i=cur-1;i>=0;i--)
{
int k=lower_bound(g+1,g+cur+1,a[i])-g;
g[k]=a[i];
ans=max(ans,k);
}
printf("Test #%d:\n",cas++);
printf(" maximum possible interceptions: %d\n",ans);
printf("\n");
}
return 0;
}