Fork me on GitHub

列车调度 manage

问题描述
有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;
} 
posted @ 2017-09-24 17:48  primes  阅读(98)  评论(0)    收藏  举报