火車站的列車調度鐵軌的結構以下圖所示。ios
兩端分別是一條入口(Entrance)軌道和一條出口(Exit)軌道,它們之間有N條平行的軌道。每趟列車從入口能夠選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照{8,4,2,5,3,9,1,6,7}的順序排隊等待進入。若是要求它們必須按序號遞減的順序從出口離開,則至少須要多少條平行鐵軌用於調度?c++
輸入格式:優化
輸入第一行給出一個整數N (2 <= N <= 105),下一行給出從1到N的整數序號的一個重排列。數字間以空格分隔。spa
輸出格式:debug
在一行中輸出能夠將輸入的列車按序號遞減的順序調離所須要的最少的鐵軌條數。code
輸入樣例:blog
9 8 4 2 5 3 9 1 6 7
輸出樣例:隊列
4
開始本身寫的程序分沒有拿全,有兩組時間超限。
在網上看到別人有set寫的,且考慮的比個人優化了不少,在每次剛加進來的時候進行的判斷。
#include<set> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define maxn 100010 #define debug(a) cout << #a << ": " << a << endl using namespace std; int main() { int n; while( cin >> n ) { int t; set<int> s; s.insert(0); for( int i = 0; i < n; i ++ ) { cin >> t; //若是t小於全部隊尾最大值,那麼刪除最大值加入t,即知足了遞減 if( t < *s.rbegin() ) { //s.rbegin()是當前全部隊列隊尾的最大值(即集合中的最大值) s.erase(*s.upper_bound(t)); //s.upper_bound(t)返回的是第一個大於t的迭代器的位置,erase刪除 } s.insert(t); } cout << s.size() - 1 << endl; } return 0; }