算法竞赛入门经典 例题6-2 铁轨(C、python)
生活随笔
收集整理的這篇文章主要介紹了
算法竞赛入门经典 例题6-2 铁轨(C、python)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
同個人網站 https://www.serendipper-x.cn/,歡迎訪問 !
問題描述:
某城市有一個火車站,鐵軌鋪設如圖所示。有n節車廂從A方向駛入車站,按進站順序編號為 1~n 。你的任務是判斷是否能讓它們按照某種特定的順序進入 B 方向的鐵軌并駛出車站。例如,出棧順序(5 4 1 2 3)是不可能的,但(5 4 3 2 1)是可能的。
為了重組車廂,你可以借助中轉站 C。這是一個可以停放任意多節車廂的車站,但由于末端封頂,駛入 C 的車廂必須按照相反的順序駛出 C。對于每個車廂,一旦從 A 移入 C ,就不能再回到 A 了;一旦從 C 移入 B,就不能回到 C 了。換句話說,在任意時刻,只能由兩種選擇: A -> C 和 C -> B。
分析: 在這里中轉站 C 符合先進后出的原則,可以把它當作是棧。
C:
#include<cstdio> #include<stack> using namespace std; const int MAXN = 1000 + 10;int n, target[MAXN];int main(){while(scanf("%d", &n) == 1){stack<int> s;int A = 1, B = 1;for(int i = 1; i <= n; i++)scanf("%d", &target[i]);int ok = 1;while(B <= n){if(A == target[B]){A++;B++;}else if(!s.empty() && s.top() == target[B]){s.pop();B++;}else if(A <= n)s.push(A++);else{ok = 0;break;}}printf("%s\n", ok ? "Yes" : "No");}return 0; }Python:
n = int(input()) target = list(map(int, input().split())) # 測試隊列 stack = []ok, A, B = 1, 1, 0 while B < n:if A == target[B]:A += 1B += 1elif len(stack) != 0 and stack[len(stack)-1] == target[B]:stack.pop()B += 1elif A <= n:stack.append(A)A += 1else:ok = 0break if ok == 1:print ("Yes") else:print ("No") 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的算法竞赛入门经典 例题6-2 铁轨(C、python)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第十届蓝桥杯 等差数列(Python)
- 下一篇: 爬取Github Web API 并存入