L2-014. 列車調度
火車站的列車調度鐵軌的結構如下圖所示。

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
思路:進來的數與也有之前優先隊列(非遞增)尾部的數進行比較小則插入該隊列,否則新創建一個隊列裝自己,其實這樣就數組每次保存最后一個最小數即可。然而超時了

#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(雖然這個博主沒有講清為什么這樣寫,但是和我的思路完全吻合),下面每個顏色就是一個隊列,注意顏色數字呈非遞增序列。
#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; }
今天四月二號,昨天參加完藍橋杯,體驗了一把高中理綜數學考試,辛苦半天一激動寫錯兩題。不知道還有沒有省獎,祝自己好運