時間限制
300 ms
記憶體限制
65536 kb
**長度限制
8000 b
判題程式
standard
作者 陳越
火車站的列車排程鐵軌的結構如下圖所示。
figure
兩端分別是一條入口(entrance)軌道和一條出口(exit)軌道,它們之間有n條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則至少需要多少條平行鐵軌用於排程?
輸入格式:
輸入第一行給出乙個整數n (2 <= n <= 105),下一行給出從1到n的整數序號的乙個重排列。數字間以空格分隔。
輸出格式:
在一行中輸出可以將輸入的列車按序號遞減的順序調離所需要的最少的鐵軌條數。
輸入樣例:
9輸出樣例:8 4 2 5 3 9 1 6 7
4
#include #include using namespace std;
/**必須要車號大的先出,小的後出。所以列車排隊的每一隊必須是從大到小排列(從右往左看),才能保證開出去的車也是從大到小的。
對於每乙個想要進入並列鐵軌的車,如果車號大於每一隊的隊尾的車號,說明不能進入已經有的隊伍,必須進入新的鐵軌
否則,選擇乙個最接近它車號的尾部車號的隊伍進入
其實無需儲存每乙個並行佇列的所有值,只需要儲存當前隊伍的車尾(就是每一列最左邊 即 每一列的最小值)即可
因為每一次都是需要排序比較大小的,所以用set自動排序
首先把set裡面放入乙個0值。每一次set的最後乙個值s.rbegin()都是當前所有佇列隊尾的最大值.
如果當前想要進入排隊隊伍的t值比集合裡面最大值小,就移除第乙個比他大的值,然後把t插入集合中。表示的是將t值插入了最接近它車號的隊伍的隊尾
否則就直接插入進去t值。作為新的隊伍。
s.upper_bound(t)返回的是第乙個大於t的迭代器的位置
在前面加星號表示取這個位置的值
所以s.erase(*(s.upper_bound(t)));表示刪除當前這個剛好大於t的位置處的值
因為一開始插入了乙個沒有的0,所以最後輸出是s.size()-1;
參見:柳婼 の blog
*/int main()
s1.insert(temp);
}cout<
return 0;
}
L2 014 列車排程
火車站的列車排程鐵軌的結構如下圖所示。兩端分別是一條入口 entrance 軌道和一條出口 exit 軌道,它們之間有n條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則至少需要多少條...
L2 014 列車排程
think 剛剛開始感覺做法和 動態規劃的 最少攔截系統 相似,後來發現 max n 10 5 數值較大,感覺會tle的樣子,所以就用stl的set來處理。最後只要返回set的size即為所求 火車站的列車排程鐵軌的結構如下圖所示。兩端分別是一條入口 entrance 軌道和一條出口 exit 軌道...
L2 014 列車排程
火車站的列車排程鐵軌的結構如下圖所示。figure 兩端分別是一條入口 entrance 軌道和一條出口 exit 軌道,它們之間有n條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則...