1. 程式人生 > >A1051 Pop Sequence

A1051 Pop Sequence

這題主要自己要想通,不然很難理解
細節在程式碼註釋裡面

#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; }