PAT 天梯杯 L2-014 列车调度

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


Figure

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

输入格式:优化

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

输出格式:debug

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

输入样例:blog

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; }
相关文章
相关标签/搜索