PAT 天梯杯 L2-014 列车调度

火车站的列车调度铁轨的结构如下图所示。


Figure

两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?

输入格式:

输入第一行给出一个整数N (2 <= N <= 105),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。

输出格式:

在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。

输入样例:

9
8 4 2 5 3 9 1 6 7

输出样例:

4

开始自己写的程序分没有拿全,有两组时间超限。
在网上看到别人有set写的,且考虑的比我的优化了很多,在每次刚加进来的时候进行的判断。

#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define maxn 100010
#define debug(a) cout << #a << ": " << a << endl
using namespace std;
int main() {
    int n;
    while( cin >> n ) {
        int t;
        set<int> s;
        s.insert(0);
        for( int i = 0; i < n; i ++ ) {
            cin >> t;  //如果t小于所有队尾最大值,那么删除最大值加入t,即满足了递减
            if( t < *s.rbegin() ) {  //s.rbegin()是当前所有队列队尾的最大值(即集合中的最大值)
                s.erase(*s.upper_bound(t));  //s.upper_bound(t)返回的是第一个大于t的迭代器的位置,erase删除
            }
            s.insert(t);
        }
        cout << s.size() - 1 << endl;
    }
    return 0;
}

 

posted on 2018-03-18 21:42  九月旧约  阅读(292)  评论(0编辑  收藏  举报

导航