1051. Pop Sequence (25)
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.
Input Specification:
Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked). Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.
Output Specification:
For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.
Sample Input:5 7 5 1 2 3 4 5 6 7 3 2 1 7 5 6 4 7 6 5 4 3 2 1 5 6 4 3 7 2 1 1 7 6 5 4 3 2Sample Output:
YES NO NO YES NO
模拟堆栈,注意一点:vector删除最后一个数据是vector.erase(vector.end()-1),而不是vector.erase(vector.end())。
#include <bits/stdc++.h> using namespace std; int N, M, K; int num[1003]; bool flag[1003]; int main() { cin>>M>>N>>K; for(int i = 0; i < K; i++) { for(int j = 0; j < N; j++) { cin>> num[j]; } int index = 0; int n = 1; vector<int> numVec; while(1) { if(index == N) break; //cout<< index<< ":"<< num[index]<< ":"<< n<< endl; if(num[index] > n) { numVec.push_back(n); if(numVec.size() > M) { flag[i] = true; break; } n++; } else if(num[index] == n) { //if(flag1 == true)numVec.erase(numVec.end()); if(numVec.size() == M) { flag[i] = true; break; } index++; n++; } else if(num[index] < n) { if(numVec.size() == 0) { flag[i] = true; break; } else if(num[index] != numVec[numVec.size()-1]) { flag[i] = true; break; } numVec.erase(numVec.end()-1); index++; } } //cout<< flag[i]<< endl; } for(int i = 0; i < K; i++) { if(flag[i] == true) { cout<< "NO"<< endl; } else { cout<< "YES"<< endl; } } return 0; }