Rails

波普什市有一個著名的火車站。那裏的鄉村有着令人難以置信的丘陵。這個車站建於上個世紀。不幸的是,當時的資金極爲有限。只能建立一條地面軌道。此外,事實證明,空間站可能只是一個死衚衕(見圖),由於缺乏可用的空間,它只能有一個軌道。
在這裏插入圖片描述
當地的傳統是,從A方向到達的每一列火車都會繼續向B方向行駛,教練也會以某種方式重新組織起來。假設從A方向到達的列車編號爲N<=1000輛客車,編號爲1,2,…,N。列車重組主管必須知道是否有可能將客車繼續沿B方向行駛,以便其順序爲A1、a2、.a。幫助他並編寫一個程序來決定是否有可能獲得所需的教練訂單。你可以假設單一的客車在進入車站之前可以與列車斷開連接,並且可以移動到B方向的軌道上。你也可以假設在任何時候都可以在車站找到儘可能多的客車。但是,一旦一輛客車進入車站,它就不能返回A方向的軌道,而且一旦它離開了B方向的車站,它就不能返回車站。

輸入
輸入由行塊組成。除了最後一個模塊之外,每個塊都描述了一列火車,可能還有更多的重組要求。在塊的第一行中,有上面描述的整數N。在塊的下一行中,有1,2,…,N的置換。塊的最後一行僅包含0。

最後一個塊只包含一行,包含0。
輸出量
輸出包含與輸入中具有排列的行相對應的行。輸出的一行包含Yes,如果可以按照相應輸入行上所需的順序對教練進行編組。否則,它包含編號。此外,在與輸入的一個塊對應的行之後有一個空行。輸出中沒有與輸入的最後一個“NULL”塊相對應的行。
樣本輸入
5
1 2 3 4 5
5 4 1 2 3
0
6
6 5 4 3 2 1
0
0
樣本輸出
Yes
No

Yes

關鍵點:隨時進隨時出,做過很多遍了,但之前一直沒弄明白題意,給你一截火車,火車每個車廂是獨立的,排在棧頂的車廂想什麼時候走就什麼時候走。

解題思路:按照火車的出棧順序,將出棧元素與當前棧頂元素進行比較,不相等則入棧,如果最後棧不爲空,則按當前序列,無法正確駛出。

Code:

#include<iostream>
#include<stack>
#include<cstdio>
#define N 1005
using namespace std;
int a[N]; 
int main(){
	int n;
	while(cin>>n&&n!=0){
		while(1){
			stack<int>s;
			scanf("%d",&a[0]);
			if(a[0]==0){
				cout<<endl;
				break;
			}
			for(int i=1;i<n;i++){
				cin>>a[i];
			}
			int j=0;
			for(int i=1;i<=n;i++){
				s.push(i);
				while(!s.empty()&&s.top()==a[j]){//!s.empty()要放在前面, &&具有短路特性 
					s.pop();
					j++;
				}
			}
			if(s.empty()) cout<<"Yes\n";
			else cout<<"No\n";
		}
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章