第三部分 數據結構 -第一章 棧-1357:車廂調度(train)

1357:車廂調度(train)

時間限制: 1000 ms 內存限制: 65536 KB
提交數: 6033 通過數: 3147
【題目描述】
有一個火車站,鐵路如圖所示,每輛火車從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”(注意要大寫,不包含引號)。

【輸入樣例】
5
5 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表示棧後狀態。


思路:題目其實就是一個棧的進出,那麼如果一個數想出,那麼它前面的數必須進棧,才能操作這個出棧。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1010;
int stack[N],a[N];
int top,n;
int main(){
	cin >> n;
	for(int i = 1 ; i <= n; i++)
	cin >> a[i];
	top = 0;
	for(int i = 1,cur = 1;i <= n; i++)
	{
		while(cur <= a[i])
		stack[++top] = cur++;
		if(stack[top] == a[i])
		--top;
		else{
			cout << "NO" <<endl;
			return 0;
		}
	}
	cout << "YES" << endl;
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章