首页 > 代码库 > L2-014. 列车调度

L2-014. 列车调度

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
分析:用一个数组模拟轨道,数组长度表示当前轨道数,数组元素表示当前轨道的最后一个元素,所以用反证法可以证明一下数组最后一个元素就是当前所有轨道中的最大元素。
然后用二分去找数组中大于当前要进入轨道的元素的最小值
 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+5; 4 int a[maxn]; 5  6 //这里有个一定性:就是在数组len-1之前的元素一定都比 a[len-1]小;反证法一下,如果不比a[len-1]小,那a[len-1]大可放到前面去。 7 //所以a[len-1]一定是当前数组中最小的元素,然后插入K 的时候,直接和len-1比较一下就可以,满足插入条件的话就二分check一下找最接近k 8 //的并且大于k的位置插入  9 int main(){10     int n;11     cin>>n;12     int k, len=0;13     while(n--){14         cin>>k;15         if(len==0||a[len-1]<k){16             a[len++]=k;17         }else{18             int l=0, r=len-1;19             while(l<r){20                 int mid=l+(r-l)/2;21                 if(a[mid]>k)22                     r=mid-1;23                 else l=mid+1;24             }25             a[l]=k;26         }27     }28     cout<<len<<endl;29     return 0;30 } 

 

L2-014. 列车调度