【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