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輸出樣例:
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 }