# Stack# Greedy# Simulation

c123 - 00514 - Rails

🔗 前往 ZeroJudge 原題

題目描述

題目描述了一個火車調度問題。火車有 N 節車廂,編號 1 到 N。火車從 A 方向進入車站,需要以特定的順序從 B 方向離開。給定一個車廂排列順序,判斷是否能按照該順序離開車站。

解題思路

這題可以使用堆疊來模擬火車進出車站的過程。我們將目標排列的車廂一個個嘗試放入堆疊中。如果當前要放入的車廂編號與堆疊頂部的車廂編號相同,則將堆疊頂部的車廂彈出,表示該車廂已成功離開車站。如果當前要放入的車廂編號與堆疊頂部的車廂編號不同,則將該車廂放入堆疊中。如果所有車廂都已嘗試放入堆疊,且堆疊為空,則表示該排列是可行的,輸出 "Yes"。否則,輸出 "No"。

複雜度分析

  • 時間複雜度: O(N^2) (最壞情況下,每個車廂都需要遍歷堆疊)
  • 空間複雜度: O(N) (堆疊最多存儲 N 個車廂)

程式碼

#include <iostream>
using namespace std;
int a[1001],sc[1001],it,it2;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int n;
	while(cin >> n){
		if(n==0)break;
		while(cin >> a[0]){
			if(a[0]==0){
				cout << "\n";
				break;
			}
			for(int i=0;i<n;++i){
				a[i+1]=0;
				sc[i]=0;
			}
			it=0;it2=0;
			for(int i=1;i<n;++i)
				cin >> a[i];
			for(int i=0;i<n;++i){
				sc[it]=i+1;
				++it;
				while(sc[it-1]==a[it2]&&it){
					sc[it]=0;
					a[it2]=0;
					--it;
					++it2;
				}
			}
			if(it2==n)
				cout << "Yes\n";
			else
				cout << "No\n";
		}
	}
}

Discussion