閱讀755 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【Tsinghua】列車調度(Train)

這題沒什麼好說的,就是一個棧的實現,因為當時那個OJ不能用STL,就自己寫了一個功能有,但是不完善的棧,反正解出題目了。。。。。。

注意:此題是第二次mooc課程,但是我參加的第一次mooc課,所以ac代碼可能不能直接提交,需要修改


列車調度(Train)

描述

某列車調度站的鐵道聯接結構如圖所示。

其中,A為入口,B為出口,S為中轉盲端。所有鐵道均為單軌單向式:列車行駛的方向隻能是從A到S,再從S到B;另外,不允許超車。因為車廂可在S中駐留,所以它們從B端駛出的次序,可能與從A端駛入的次序不同。不過S的容量有限,同時駐留的車廂不得超過m節。

設某列車由編號依次為{1, 2, ..., n}的n節車廂組成。調度員希望知道,按照以上交通規則,這些車廂能否以{a1, a2, ..., an}的次序,重新排列後從B端駛出。如果可行,應該以怎樣

的次序操作?

輸入

共兩行。

第一行為兩個整數n,m。

第二行為以空格分隔的n個整數,保證為{1, 2, ..., n}的一個排列,表示待判斷可行性的駛出序列{a1,a2,...,an}。

輸出

若駛出序列可行,則輸出操作序列,其中push表示車廂從A進入S,pop表示車廂從S進入B,每個操作占一行。

若不可行,則輸出No。

輸入樣例1

5 2
1 2 3 5 4

輸出樣例1

push 
pop 
push 
pop
push
pop
push
push
pop
pop

輸入樣例2

5 5
3 1 2 4 5

輸出樣例2

No

限製

1 ≤ n ≤ 1,600,000

0 ≤ m ≤ 1,600,000

時間:2 sec

空間:256MB




AC的代碼:
#include <stdio.h>
#define MANX 100005

int Stack[MANX];
int Out[MANX];
int sTop=0;	//棧頂指針

void push(int a)
{
	Stack[++sTop]=a;
}

void pop()
{
	sTop--;
}

int top()
{
	return Stack[sTop];
}

int main()
{
	// in 的時候一定是{1, 2, ..., n}
	int n,m;
	scanf("%d%d",&n,&m);
	
	int i;
	for(i=1;i<=n;i++)
		scanf("%d",&Out[i]);
	
	//算法開始
	int j=0;
	for(i=1;i<=n;i++)
	{
		//如果小於棧頂元素,直接可判斷在棧中而無法出棧
		if(Out[i]<top())
		{
			printf("No\n");
			return 0;
		}

		//直到 Out[i] 的元素全部加入棧
		if(j<Out[i])
			while(j!=Out[i])
				push(++j);
		
		if(sTop>m)
		{
			printf("No\n");
			return 0;
		}
		
		if(Out[i]==top())
			pop();
	}

	printf("Yes\n");
	
	return 0;
}







最後更新:2017-04-03 05:39:41

  上一篇:go obj-c編程18:多對多的觀察者模式
  下一篇:go C++ vector用法