PAT (Advanced Level) Practice 1051 Pop Sequence

思路:遍歷每個序列,遍歷時維護一個值maxn(已遍歷過的數中的最大數),maxn初始值爲0。
對於每個數字 i:
1、若 i 大於maxn,則往棧中push 【maxn+1,i】之間的數(端點值要取),接下來判斷是否超出容量,超出則不能構成該序列。

若未超出,則pop棧頂的值(即 i),同時 令maxn=i。

2、若 i 小於maxn,則查看棧頂的值是否等於 i ,不是則不能構成該序列,是則pop棧頂值。
 

#include <iostream>
#include <stack>
#include <vector>
#include <stdio.h>
using namespace std;
int maxin,m,n,k;
int main()
{
    cin>>m>>n>>k;
    for(int i=0;i<k;i++){
        vector<int> seq;
        stack<int> st;
        maxin=0;
        for(int j=0;j<n;j++){
            int data;
            scanf("%d",&data);
            seq.push_back(data);
        }
        bool flag=true;
        for(int h=0;h<seq.size();h++){
            if(seq[h] > maxin){
                for(int i=maxin+1;i<=seq[h];i++){
                    st.push(i);
                }
                if(st.size()>m){
                    flag=false;
                    break;
                }
                maxin=seq[h];
                st.pop();
            }else{
                if(st.top()==seq[h]){
                    st.pop();
                }else{
                    flag=false;
                    break;
                }
            }
        }
        if(flag) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

 

發佈了79 篇原創文章 · 獲贊 52 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章