首页 > 代码库 > 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. 列车调度
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。