题目大意:
给定若干组数,每组以-1结尾,求每组的最长下降序列。
题目思路:我们可以将这道题中的数的顺序倒过来,就变成了lis的裸题了,注意n^2不行:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int a[1000010],z[1000010],b[100001];
int main(void){
int i,j,k=0,m,n=0,t;
while(scanf("%d",&t)!=EOF,t!=-1){//输入
n=0;
n++;
b[n]=t;//将t存入b
k++;
while(scanf("%d",&t)!=EOF,t!=-1)//输入分组
b[++n]=t;
for(i=1;i<=n;i++)//将b中的数在a中倒序排列
a[i]=b[n-i+1];
z[1]=a[1];
int top=1;
for(i=2;i<=n;i++){//lis
if(a[i]>z[top]){//当a[i]更大时栈顶++,将a[i]存入栈顶
top+=1;
z[top]=a[i];
continue;
}
int r=1;
int l=top;
while(r<=l){//否则将a[i]放在最后一个比他小的后面
int mid=(r+l)/2;
if(z[mid]<a[i])
r=mid+1;
else l=mid-1;
}
z[r]=a[i];
}
printf("Test #%d:\n",k);//输出
printf(" maximum possible interceptions: %d\n\n",top);
}
return 0;
}