有乙個火車站,鐵路如圖所示,每輛火車從a駛入,再從b方向駛出,同時它的車廂可以重新組合。假設從a方向駛來的火車有n節(n≤1000),分別按照順序編號為1,2,3,…,n。假定在進入車站前,每節車廂之間都不是連著的,並且它們可以自行移動到b處的鐵軌上。另外假定車站c可以停放任意多節車廂。但是一旦進入車站c,它就不能再回到a方向的鐵軌上了,並且一旦當它進入b方向的鐵軌,它就不能再回到車站c。
負責車廂排程的工作人員需要知道能否使它以a1,a2,…,an的順序從b方向駛出,請來判斷能否得到指定的車廂順序。
第一行為乙個整數n,其中n≤1000,表示有n節車廂,第二行為n個數字,表示指定的車廂順序。
如果可以得到指定的車廂順序,則輸出乙個字串」yes」,否則輸出」no」(注意要大寫,不包含引號)。
55 4 3 2 1
yes解析:觀察發現,整個排程過程其實是在模擬入棧出棧的過程,而這個過程中,我們可以分成三種狀態:棧前、棧中、棧後。我們可以發現,當某個數字出棧了,說明比它小的數字要麼已經出棧了,要麼還在棧裡,不能是入棧前狀態,並且在棧中的順序是從大到小的(從棧頂往棧底看),比如出5,那麼1,2,3,4要麼已經在5之前出了,要麼還在棧中(假如1,3,4在棧中,從棧頂往棧底看依次為4,3,1),不能是入棧前的狀態。如果某個數字要出棧,那麼當前在棧中的數字都必須小於它,否則就與棧的性質矛盾,不合法,於是我們可以這樣解決:
從第乙個數字開始掃瞄,a[i]表示當前出棧的數字,如果有比a[i]大的數字還在棧中,那麼就產生矛盾,輸出「no」;否則,標記當前數字a[i]為棧後狀態,那麼[1, a[i]-1]這些數字如果還沒出棧,標記為棧中狀態。具體我們可以用0表示為確定狀態,1表示棧中狀態,2表示棧後狀態。
總結:其實說白了 ,如果符合乙個棧的進出,那麼如果乙個數想出,那麼它前面的數必須進棧,才能操作這個出棧
#includeusing namespace std;
stackp;
int s[1500];
int main()
for(int i=1,flag=1;i<=n;i++)
if(p.top()==s[i]) p.pop();
else
}printf("yes\n");
return 0;
}
1357 車廂排程 train
題目描述 有乙個火車站,鐵路如圖所示,每輛火車從a駛入,再從b方向駛出,同時它的車廂可以重新組合。假設從a方向駛來的火車有n節 n 1000 分別按照順序編號為1,2,3,n。假定在進入車站前,每節車廂之間都不是連著的,並且它們可以自行移動到b處的鐵軌上。另外假定車站c可以停放任意多節車廂。但是一旦...
1357 車廂排程 train (棧)
1357 車廂排程 train 時間限制 1000 ms 記憶體限制 65536 kb 提交數 6775 通過數 3515 題目描述 有乙個火車站,鐵路如圖所示,每輛火車從a駛入,再從b方向駛出,同時它的車廂可以重新組合。假設從a方向駛來的火車有n節 n 1000 分別按照順序編號為1,2,3,n。...
ybt1357 車廂排程
時空限制 1000ms 64mb 有乙個火車站,鐵路如圖所示,每輛火車從a駛入,再從b方向駛出,同時它的車廂可以重新組合。假設從a方向駛來的火車有n節 n 1000 分別按照順序編號為1,2,3,n。假定在進入車站前,每節車廂之間都不是連著的,並且它們可以自行移動到b處的鐵軌上。另外假定車站c可以停...