火車站的列車排程鐵軌的結構如下圖所示。
兩端分別是一條入口(entrance)軌道和一條出口(exit)軌道,它們之間有n條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則至少需要多少條平行鐵軌用於排程?
輸入格式:
輸入第一行給出乙個整數n (2 ≤ n ≤10^5),下一行給出從1到n的整數序號的乙個重排列。數字間以空格分隔。
輸出格式:
在一行中輸出可以將輸入的列車按序號遞減的順序調離所需要的最少的鐵軌條數。
輸入樣例:
98 4 2 5 3 9 1 6 7
輸出樣例:
4思路:想要鐵軌數最少,就必須按照序號遞降的順序(火車可以直接出去)並且盡可能多的放進去,什麼意思呢?演示一下題目的例子:
第乙個火車過來(8):當前沒有軌道,先建乙個:
軌道狀態:第乙個軌道:8
第二個火車過來(4):4 比 8小,放在8後面:
軌道狀態:第乙個軌道:4->8
第三個火車過來(2):2 比 4小,放在4後面:
軌道狀態:第乙個軌道:2->4->8
第四個火車過來(5):5 比 2大,不能放在2後面,新建乙個軌道
軌道狀態:第乙個軌道:2->4->8
第二個軌道:5
第五個火車過來(3):3 比 5小,放在5後面
軌道狀態:第乙個軌道:2->4->8
第二個軌道:3->5
第六個火車過來(9):9 比 max(2,3)大,新建乙個軌道
軌道狀態:第乙個軌道:2->4->8
第二個軌道:3->5
第三個軌道:9
第七個火車過來(1):1 比 2小,放在2後面
軌道狀態:第乙個軌道:1->2->4->8
第二個軌道:3->5
第三個軌道:9
第八個火車過來(6):6 比 9 小,放在9後面
軌道狀態:第乙個軌道:1->2->4->8
第二個軌道:3->5
第三個軌道:6->9
第九個火車過來(7):7 比 max(1,3,6)大,新建乙個軌道
軌道狀態:第乙個軌道:1->2->4->8
第二個軌道:3->5
第三個軌道:6->9
第四個軌道:7
看完以上過程,相信你很好理解放進去的時候,需要與每個軌道的最後一輛火車進行編號比較,若比所有軌道的最大值還大,則需要新建軌道,否則應該放到比需要放進的火車的編號大一點點的軌道最為合適。
下面的**用了multiset容器,大致思路是:在容器中找到比當前需要插入的火車編號大的編號,如果找到了,讓他開走(刪除)插入當前編號。這個容器會自動排序,實現起來還是挺方便的。
#include
#include
using
namespace std;
const
int maxn =
1e5+10;
int a[maxn]=;
intmain()
multiset<
int>ms;
//容器申明
for(
int i =
1; i <= n; i++
) ms.
insert
(tmp)
;//插入當前火車編號
}printf
("%d"
, ms.
size()
);return0;
}
PTA 列車排程
火車站的列車排程鐵軌的結構如下圖所示。兩端分別是一條入口 entrance 軌道和一條出口 exit 軌道,它們之間有n條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則至少需要多少條...
PTA列車排程
火車站的列車排程鐵軌的結構如下圖所示。兩端分別是一條入口 entrance 軌道和一條出口 exit 軌道,它們之間有n條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則至少需要多少條...
列車排程(PTA)
7 11 列車排程 25 分 火車站的列車排程鐵軌的結構如下圖所示。兩端分別是一條入口 entrance 軌道和一條出口 exit 軌道,它們之間有n條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照的順序排隊等待進入。如果要求它們必須按序號遞減的順...