天梯赛:L2-014 列车调度
题目描述

两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?
输入样例:
9
8 4 2 5 3 9 1 6 7
输出样例:
4
思路
建立N个栈,cnt记录当前用了几个栈,就是几个轨道。遍历火车,找到比当前火车编号大的第一个轨道上的栈顶火车,压入栈;找不到就引入下一个轨道。
注意事项
1.栈空间限制
使用数组模拟,只存储栈顶元素
2.时间限制,n是1e5级别
二分来优化时间复杂度
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 101010;
int a[N];
int stk[N];
int cnt = 0;
int not_found = 0x3f3f3f3f;
int find(int l, int r, int x){ //找到第一个比x大的数
l = l-1, r = r+1;
int mid = l+r>>1;
while(l+1!=r)
{
if(stk[mid]<=x) l = mid;
else r = mid;
mid = l+r>>1;
}
if(l>=0 && stk[l]<x && l==cnt) return not_found;
else return r;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n; cin >> n;
cin >> a[0]; stk[0] = a[0];
for(int i=1;i<n;i++){
cin >> a[i];
int t = find(0,cnt,a[i]);
//cout<<t<<endl;
if(t==not_found) stk[++cnt] = a[i];
else stk[t] = a[i];
}
cout<<cnt+1;
return 0;
}
251



被折叠的 条评论
为什么被折叠?



