题解|railway
由于题目链接无法解析,我直接截图呈现这道题是一道英文题,而且很长,整体的题意我就不做翻译了。
他要求我们判断他给定的序列是否可行。
看他的规则,是每来一节车,如果符合序列的车直接先行而不符合的车则先停留在车站且停留的车离开时需按照 “后进先出” 的顺序
很明显,我们应该用栈来解决这个问题。
整体代码如下:
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<deque>
#include<cmath>
using namespace std;
void a(vector<int> &nums,int n);
int main(){
int n,t0;
vector<int> nums;
cin>>n; //先读取n
while(n){ //通过判断n是否为0来判断是否继续
for(int i=0;i<n;i++){
cin>>t0;
nums.push_back(t0);
if(!nums[0]) break; //如果第一个就读到了0,代表着要更迭块了
}
if(!nums[0]){
cin>>n; //进行块更迭
nums.pop_back(); //要记得把nums清空
if(n) cout<<"\n";
}
else a(nums,n);
}
return 0;
}
//核心函数
void a(vector<int> &nums,int n){
stack<int> st;
int j=0;
for(int i=1;i<=n;i++){
if(i==nums[j]) j++; //符合序列,直接过,序列后推
else st.push(i); //不符合序列,先入栈,存进车站里
while(!st.empty()&&st.top()==nums[j]){ //如果栈顶有符合的,依次出栈,离开车站
st.pop();
j++;
}
}
if(st.empty()) cout<<"Yes"<<"\n"; //最后栈为空,即序列可行
else cout<<"No"<<"\n"; //否则,为不可行
nums.clear();
}