题意
有一个栈大小为M的栈,有一个数列1,2,3,…,n要入栈,你可以任意时候出栈,给你一个k个出栈的序列,判断是否可以由这个数列得到,如果可以输出YES,不能则输出NO。
解题思路
对于入栈出栈的队列我们可以知道两个关系:
(1)对于刚出栈的数x,1~x内未出栈的个数应该小于栈的大小M。
(2)对应刚出栈的数x,如果比前一个出栈的数y小,那么x~y之间的所有数应该全部出栈。
因此我们可以扫描序列,对序列进行上述判断,一旦其中之一不满足,则出栈顺序错误。
参考代码
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAXN 1000+5
int a[MAXN];
bool used[MAXN];
int m,n,k;
bool f(int x){
int cnt=0;
for (int i=1;i<=x;i++)
if (!used[i])
cnt++;
if (cnt>m) return false;
return true;
}
bool g(int x,int y){
for (int i=x+1;i<y;i++)
if (used[i]==false)
return false;
return true;
}
int main(){
scanf("%d%d%d",&m,&n,&k);
while (k--){
for (int i=0;i<n;i++) scanf("%d",&a[i]);
memset(used,false,sizeof(used));
int flag=0;
for (int i=0;i<n;i++){
if (f(a[i])==false){
printf("NO\n");
flag=1;
break;
}
if (i!=0 && a[i]<a[i-1] && g(a[i],a[i-1])==false){
printf("NO\n");
flag=1;
break;
}
used[a[i]]=true;
}
if (!flag) printf("YES\n");
}
return 0;
}