L2-014. 列车调度

来源:互联网 发布:js元素节点举例 编辑:程序博客网 时间:2024/04/30 16:57

L2-014. 列车调度

时间限制
300 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

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


Figure

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

输入格式:

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

输出格式:

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

输入样例:
98 4 2 5 3 9 1 6 7
输出样例:
4
开一个数组,每一个元素都表示一根铁路。

对于每一个新输入的数,查找数组中已有的比他大的最小的那个元素,把这个元素的值更新为这个数。

在这个题中的意义就是:如果这正停着的一辆车的编号比新来的车大,新来的这辆车就可以和那辆大车公用一条线路。

因为大的总比小的先出去,所以只要记录每一条线路上最小的那个就可以。

对于出去的车,也不必把它删掉。因为比他大的肯定已经提前出去了,对于后来的比他小的车,他停在这并不影响线路使用。

显然这个数组是按降序排列的,所以查找位置时可以用二分。


#include<cstdio>#include<iostream>#include<cstring>#include<cmath>#include<set>#include<algorithm>#include<queue>#define fin freopen("in.txt", "r", stdin)#define mem(a,b) memset(a, b, sizeof(a) )#define f(x) p[x].first#define s(x) p[x].second#define sf(x) p[x].second.first#define ss(x) p[x].second.secondusing namespace std;typedef pair<int, int> P;int a [100100];int main (){mem(a, 0x3f);//所有线路初始化为正无穷int n;scanf("%d", &n);int cnt = 1;for(int i= 0; i< n; i++){int t;scanf("%d", &t);int p = lower_bound(a, a+cnt, t) - a;if(p >= cnt) cnt++;a[p] = t;}printf("%d\n", cnt);return 0;}



0 0