• 列车调度 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;
    } 
  • 相关阅读:
    ICEY修改实现ICEY锁血,修改data文件实现主之名关卡重现,顺便改金币
    gg修改器修改聚爆
    MOUSE_OVER 与 ROLL_OVER
    Tween 没有完毕 就停止
    如何将FLex AIR运行环境与AIR程序一起打包(转http://www.awsws.com/?p=94)
    做项目如做人
    flex 打开外部的swf 并调用其方法
    air 零散知识
    贝塞尔曲线的绘制
    air 读取sqlite的Date类型 解决方案
  • 原文地址:https://www.cnblogs.com/dfsac/p/7587806.html
Copyright © 2020-2023  润新知