问题描述
有N辆列车,标记为1,2,3,…,N。它们按照一定的次序进站,站台共有K个轨道,轨道遵从先进先出的原则。列车进入站台内的轨道后可以等待任意时间后出站,且所有列车不可后退。现在要使出站的顺序变为N,N-1,N-2,…,1,询问K的最小值是多少。
对于30%的数据,N≤10;
对于70%的数据,N≤2000;
对于100%的数据,N≤100000。
模拟一下这个过程,我们可以发现,要满足题目要求,我们只能见后来的车放到比它序号大的车后面,才能保证题目要求。我们每一次放车都尽量把车放到比它序号刚好大的已经放入的车中,我们用一个队来存,然后用lower_bound来找就行了。时间复杂度O(nlogn)
再详细解释一下:
看一下这组样例
9
1 3 2 4 8 6 9 5 7
ans=5
怎么样排呢?
1 3 4 8 9
2 6 7
5
这是正解了。
怎么觉的这个好像最长上升子序列呢?
原来我们需要求至少有多少个递减序列,那么每个递减子序列的头排列起来就是最长上升子序列。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cstdio>
#define LL long long
#define N 100009
using namespace std;
int n,a[N],q[N],len;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
q[++len]=a[1];
for(int i=2;i<=n;i++)
{
if(a[i]>q[len]) q[++len]=a[i];
else{
int t=lower_bound(q+1,q+len+1,a[i])-q;
q[t]=a[i];
}
}
printf("%d",len);
return 0;
}