火車站的列車排程鐵軌的結構如下圖所示。
兩端分別是一條入口(entrance)軌道和一條出口(exit)軌道,它們之間有n
條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則至少需要多少條平行鐵軌用於排程?
輸入第一行給出乙個整數n
(2 ≤n
≤105),下一行給出從1到n
的整數序號的乙個重排列。數字間以空格分隔。
在一行中輸出可以將輸入的列車按序號遞減的順序調離所需要的最少的鐵軌條數。
9
8 4 2 5 3 9 1 6 7
4
分析:出這道題的人的語文成績估計一塌糊塗……
可以這麼理解題意:原本,只有一條連線出入口的軌道。現在,由於好幾輛車都不是順序駛入,卻還要求他們降序駛出,所以需要另開出其他軌道供它們 走,使得它們能降序駛出。(但原有軌道應算在結果裡)
想讓列車按降序輸出,那麼必須讓同一條軌道上的車編號大的先進入,編號小的後進入,而如果一條軌道上編號最小的車的編號如果比要處理的
車的編號還要小的話,那麼這個該處理的車就必須新開一條軌道去讓該車進入。
樣例中輸出的結果應該是 8 4 2 1——————
5 3——————————
9 6——————————
7————————————
1、考慮使用二分法
2、使用set容器
先將乙個數插入進set容器中,set容器預設從小到大(自動排序);
依次進行每個數的輸入,如果輸入的數比當前set容器中的最後乙個數小,刪除set容器中第乙個大於輸入數的值,再將輸入數進行插入,
重新排序後,輸入的值就代替了刪除的值,依次迴圈往復,進行到結尾 。
**二分法做法:
#includeusingset做法:namespace
std;
intmain()
; //
最大到十萬
int i,sum=0
;
intx;
for(i=0;i)
else
//該車比前車小,考慮是跟著前車的路,還是跟著其它比它大的車的路
a[p]=x;}}
printf("%d
",sum);
}
#includeusingnamespace
std;
intmain()
;
sets;
intn;
scanf("%d
",&n);
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
else
s.insert(a[i]);
}cout
<
}
PTA 7 1 列車廂排程(棧的應用)
題目點我 樣例如圖 1 3軌道都可以看成是棧,不論是1軌還是3軌都應該讓棧頂指向車廂在軌道的移動方向 因為棧的優點是在棧頂插入和刪除元素很方便,反過來的話 寫起來會很麻煩 結合圖和題目要求的輸入,兩個輸入都應該逆序入棧 1.先定義乙個標記int flag 1 假定按輸入的排程方式不會出現問題。當出問...
PTA 資料結構 陣列迴圈左移
7 1 陣列迴圈左移 20 分 本題要求實現乙個對陣列進行迴圈左移的簡單函式 乙個陣列a中存有n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向左移m 0 個位置,即將a中的資料由 a 0 a 1 a n 1 變換為 a m a n 1 a 0 a 1 a m 1 最前面的m個數迴圈移至...
pta資料結構
是否二叉搜尋樹 這題只要是了解二叉查詢樹的特點。bool isbst bintree t while right1 return isbst t left isbst t right 線性探測法的查詢函式 主要注意雜湊函式,這裡那個常量是真的坑,卡了半天。position find hashtabl...