火車站的列車調度鐵軌的結構以下圖所示。ios
兩端分別是一條入口(Entrance)軌道和一條出口(Exit)軌道,它們之間有N條平行的軌道。每趟列車從入口能夠選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照{8,4,2,5,3,9,1,6,7}的順序排隊等待進入。若是要求它們必須按序號遞減的順序從出口離開,則至少須要多少條平行鐵軌用於調度? 數組
輸入格式: ide
輸入第一行給出一個整數N (2 <= N <= 105),下一行給出從1到N的整數序號的一個重排列。數字間以空格分隔。 spa
輸出格式: .net
在一行中輸出能夠將輸入的列車按序號遞減的順序調離所須要的最少的鐵軌條數。 code
輸入樣例:9 8 4 2 5 3 9 1 6 7輸出樣例:
4
思路:進來的數與也有以前優先隊列(非遞增)尾部的數進行比較小則插入該隊列,不然新建立一個隊列裝本身,其實這樣就數組每次保存最後一個最小數便可。然而超時了
#include<cstdio> #include<climits> #include<iostream> using namespace std; int main() { int cnt[100005]; int n, min = 0; cin >> n; for (int i = 0; i < n; i++){ int num; cin >> num; int flag = 0; for (int j = 0; j < min;j++) if (cnt[j] >= num){ flag = 1; cnt[j] = num; break; } if (flag == 0){ cnt[min] = num; min++; } } cout << min << endl; return 0; }
而後百度參考了一下:https://blog.csdn.net/guozlh/article/details/63007931(雖然這個博主沒有講清爲何這樣寫,可是和個人思路徹底吻合),下面每一個顏色就是一個隊列,注意顏色數字呈非遞增序列。blog
#include<set> #include<cstdio> #include<climits> #include<iostream> using namespace std; int main() { int n; cin >> n; set<int>se; set<int>::iterator iter; for (int i = 0; i < n; i++){ int temp; cin >> temp; if (se.upper_bound(temp) != se.end()){ iter = se.upper_bound(temp); se.erase(*iter); } se.insert(temp); } cout << se.size() << endl; return 0; }
今天四月二號,昨天參加完藍橋杯,體驗了一把高中理綜數學考試,辛苦半天一激動寫錯兩題。不知道還有沒有省獎,祝本身好運