A1051 Pop Sequence
阿新 • • 發佈:2018-12-02
這題主要自己要想通,不然很難理解
細節在程式碼註釋裡面
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn = 1010;//最大N
int a[maxn]; //序列
int chk[maxn]; //判斷數字狀態:未進棧,棧內,出棧
bool Judge(int a[],int capacity,int len)
{
if(capacity < len){ //說明序列長度大於棧的容量,有可能棧溢位,下面做判斷
for(int i=1;i<=len; i++){
if(a[i]>capacity && i<=a[i]-capacity)return false;
}
}
fill(chk,chk+len+1,-1); //-1表示沒有進棧,0表示在棧內,1表示已經出棧
int top = 0; //記錄棧頂元素
for(int i=1;i<=len;i++){
if(a[i] < top)return false;//比棧頂元素先出棧,不可能
chk[a[i]] = 1; //a[i]出棧
for(int j=a[i]-1;j>=1;j--){
if(chk[j] == - 1)chk[j] = 0;//對於小於a[i]的數字,如果有未進棧的(說明也沒有出棧)
}
top = 0; //初始化
for(int j=a[i]-1;j>=1;j--){ //a[i]出棧後尋找棧頂元素,不一定是a[i]-1的
if(chk[j] == 0){
top = j;
break;
}
}
}
return true;
}
int main(int argc, char const *argv[])
{
int m,n,k;
scanf("%d%d%d",&m,&n,&k);
for(int i=0;i<k; i++){
for(int j=1;j<=n;j++)scanf("%d",&a[j]);
if(Judge(a,m,n))printf("YES\n");
else printf("NO\n");
}
return 0;
}