PAT 1051 Pop Sequence

#include <cstdio>

#include <cstdlib>

#include <vector>



using namespace std;



bool push_validate(int &pre_push, int max_push, int cur, vector<int>& stack, int mcap) {

    if (pre_push >= max_push || pre_push >= cur) {

        // there not exist valid push for this pop

        return false;

    }

    if (cur > max_push) {

        // this pop value is out of range

        return false;

    }

    if (stack.size() + cur - pre_push > mcap) {

        // stack capacity not enough

        return false;

    }

    for (int j = pre_push+1; j<=cur; j++) {

        // push the value (if less value not pushed also push them in)

        stack.push_back(j);

    }

    pre_push = cur;

    return true;

}



bool validate(vector<int> &seq, int capacity) {

    int len = seq.size();

    int pre_push = 0;

    int max_push = len;

    

    vector<int> stack;

    int i = 0;

    while (i<len) {

        int cur = seq[i];

        //printf("cur seq: %d\n", cur);

        if (stack.empty() || cur != stack.back()) { // there must be a push before this pop or it's invalid

            if (push_validate(pre_push, max_push, cur, stack, capacity)) {

                continue;

            } else {

                return false;

            }

        }

        // easy case, just pop element from stack & check next in the pop seq

        i++;

        //printf("pop %d\n", stack.back());

        stack.pop_back();

    }

    return true;

}



int main() {

    int M, N, K;

    scanf("%d%d%d", &M, &N, &K);

    vector<int> seq(N);

    for (int i=0; i<K; i++) {

        for (int j=0; j<N; j++) {

            scanf("%d", &seq[j]);

        }

        

        if (validate(seq, M)) {

            printf("YES\n");

        } else {

            printf("NO\n");

        }

    }

    return 0;

}

以前考PAT时做过当时不知什么原因好像没全对,这回一次过

你可能感兴趣的:(sequence)