版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Yonggie/article/details/89409919
最最最intuitive的方法,直接模拟栈就行。
主要是一些细节问题,蛮烦的。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include <stack>
using namespace std;
int main()
{
int m,n,c;
while(cin>>m>>n>>c){
for(int index=0;index<c;index++){
stack<int> S;
int t=0;
cin>>t;
//previous记录前面最大值,以便压栈。
int previous=t;
bool f=1;
for(int i=1;i<=t;i++)
S.push(i);
if(S.size()>m||t>n) f=false;
S.pop();
//这里有个小细节,我为什么不i<t就行了,还要把i压进去然后再pop掉呢?
//就是因为题目有栈容量的限制,要先把所有的元素压进去,看看超不超才行。
for(int i=0;i<n-1;i++){
cin>>t;
if(!f) continue;
if(t>previous){
for(int j=previous+1;j<=t;j++)
S.push(j);
if(S.size()>m||t>n) f=false;
S.pop();
}
else{
if(S.top()!=t) f=false;
else S.pop();
}
if(t>previous)
previous=t;
}
if(f) cout<<"YES";
else cout<<"NO";
cout<<endl;
}
}
}