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的整数序号的一个重排列。数字间以空格分隔。
输出格式:
在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。
输入样例:9 8 4 2 5 3 9 1 6 7输出样例:
模拟题,一开始用二分搜索,出了点小问题,后来百度发现别人用的是set.
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> #include<set> #include<stack> #include<vector> #define maxn 100005 #define maxz 100005 #define INF 99999999 #define LL long long #define PI 3.1415926 #define MOD 50000 using namespace std; int main() { ios::sync_with_stdio(false); int n; int a[maxn]; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } set<int>s; for(int i=0;i<n;i++) { if(s.empty()) s.insert(a[i]); else { if(s.lower_bound(a[i])!=s.end()) { s.erase(s.lower_bound(a[i])); s.insert(a[i]); } else { s.insert(a[i]); } } } cout << s.size() << endl; return 0; }
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> #include<stack> #include<vector> #define maxn 100005 #define maxz 100005 #define INF 99999999 #define LL long long #define PI 3.1415926 #define MOD 50000 using namespace std; int main() { ios::sync_with_stdio(false); int n,a[maxn]; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } int tt[maxn]; int cnt=0; for(int i=0;i<n;i++) { if(i==0) { tt[cnt]=a[i]; continue; } int flag=0; int l=0; int r=cnt; while(l<=r) { int mid=(l+r)/2; if(tt[mid]>a[i]) { flag=1; int u=mid; while(tt[u]>a[i]) { u--; } tt[u+1]=a[i]; break; } l=mid+1; } if(flag==0) { cnt++; tt[cnt]=a[i]; } } cout << cnt+1 << endl; return 0; }