7-11 列車調度 (25 分)
火車站的列車調度鐵軌的結構如下圖所示。
兩端分別是一條入口(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
輸出樣例:
4
一維數組 + 二分查找
一維數組模擬各軌道,數組記錄當前軌道最小的數,設置全軌道最大值maxn
大於maxn說明當前各個軌道都容不下,軌道數+1,否則二分查找大於當前值的最小數,更新
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 int main() 8 { 9 const int N=1e5+5; 10 int tear[N]; 11 memset(tear,0,sizeof(tear)); 12 int n,x,cnt=0,maxn=0; 13 14 scanf("%d",&n); 15 for(int i=0;i<n;i++){ 16 scanf("%d",&x); 17 if(x>maxn){ 18 tear[cnt++]=maxn=x; 19 continue; 20 } 21 //二分查找 22 int l=0,r=cnt; 23 while(l!=r){ 24 if(tear[(l+r)/2]<x){ 25 l=(l+r)/2+1; 26 } 27 else{ 28 r=(l+r)/2; 29 } 30 } 31 tear[l]=x; 32 if(l==cnt-1){ 33 maxn=x; 34 } 35 } 36 cout<<cnt<<endl; 37 return 0; 38 }