PAT A1051. Pop Sequence

1051. Pop Sequence (25)

時間限制
100 ms
內存限制
65536 kB
代碼長度限制
16000 B
判題程序
Standard
作者
CHEN, Yue

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 2
Sample Output:
YES
NO
NO
YES

NO

#include <cstdio>
#include <stack>
using namespace std;

 const int maxn =1010;
 int arr[maxn];
 stack<int> st;
 
 int main(){
 	int m,n,k;
 	scanf("%d%d%d",&m,&n,&k);
 	
 	for(int i=0; i<k; i++ ){//使用while會更簡潔
	  while(!st.empty()){
	  	st.pop();
	  }
	  
	  for(int j=1; j<=n; j++){
	  	scanf("%d",&arr[j]);
	  }
	  
	  int current= 1;
	  bool flag = true;
	  
	  for(int j=1; j<=n; j++){
	  	st.push(j);
	  	if(st.size()>m){
	  		flag = false;
	  		break;
		  }
		while(!st.empty()&& st.top() == arr[current]){
	  		st.pop();
	    	current++;	
	  	  }
 		
	  }
	  
	  if(st.empty() == true && flag == true){
	  	printf("YES\n");
	  }
	  else{
	  	printf("NO\n");
	  }	  
	 }
	 return 0;
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章