zoukankan      html  css  js  c++  java
  • 【UOJ 575】列车调度

    【题目描述】:

    列车由东面进站只有一个车道,进站后站内共分有K个平行的车道,出站前汇聚为一个车道,由西面出站。

    有N辆列车,标记为1,2,3,…,N。它们按照一定的次序进站,轨道遵从先进先出的原则。列车进入站台内的轨道后可以等待任意时间后出站,且所有列车不可后退。现在要使出站的顺序变为N,N-1,N-2,…,1,询问K的最小值是多少。

    【输入描述】:

    输入共2行。

    第 1 行包含1个正整数N,表示N辆列车。

    第 2 行包含N个正整数,为1至N的一个排列,表示进站次序。

    【输出描述】:

    输出共1行,包含1个整数,表示站台内轨道数K的最小值。

    【样例输入1】:

    3
    1 2 3

    【样例输出1】:

    3

    【样例输入2】:

    9
    1 3 2 4 8 6 9 5 7

    【样例输出2】:

    5

    【时间限制、数据范围及描述】:

    时间:1s 空间:128M

    对于30%的数据,N≤10;

    对于70%的数据,N≤2000;

    对于100%的数据,N≤100000。

    题解:最长不下降子序列!推一推就出来啦,像极了楼兰宝藏那道题目。

    #include<bits/stdc++.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    using namespace std;
    const int N=100003;
    int a[N],n,s[N],k,vis[N];
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++){
            if(vis[i]==1) continue;
            bool flag=0;
            for(int j=1;j<=k;j++)
                if(a[i]<s[j]) { s[j]=a[i]; vis[i]=1; flag=1; break; } 
            if(flag==0) s[++k]=a[i];
        }
        cout<<k;
        
        return 0;
    }
  • 相关阅读:
    MT【296】必要性探路
    MT【295】线段比的仿射变换
    MT【294】函数定义的理解
    MT【293】拐点处切线
    MT【292】任意存在求最值
    MT【291】2元非齐次不等式
    MT【290】内外圆求三角最值
    MT【289】含参绝对值的最大值之三
    MT【288】必要性探路
    Xadmin-自定义字段支持实时编辑
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11503774.html
Copyright © 2011-2022 走看看