题目大意:给定一个最大容量为 M 的堆栈,将 N 个数字按 1, 2, 3, ..., N 的顺序入栈,允许按任何顺序出栈,则哪些数字序列是不可能得到的?
大致思路:一个数有两种情况:1)这个数字一进来就溜了 在违法的边缘试探 2)这个数先在栈里面待着伺机而动
根据题目所给的序列我们可以用一个队列q将其保存起来,接着按顺序让数字进来挨打,判断s.top()和q.top()是否相同,如果相同就一起push,如果不同则把这个数push进栈。这样如果顺序合法的话最后栈和队列都是空的。详见代码~
#include#define maxn 1005#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;int n,m,k,x;int a[maxn];stack st;queue q;int main(){ cin>>n>>m>>k; while(k--) { while(!st.empty()) st.pop(); while(!q.empty()) q.pop(); for(int i=1;i<=m;i++) { cin>>x; q.push(x); } int p=0,flag=0; while(true) { if(!st.empty()&&!q.empty()&&st.top()==q.front()) { st.pop(); q.pop(); } else { p++; if(p>m) break; st.push(p); if(st.size()>n) { flag=1; break; } } } if(flag) cout<<"NO"<