解题思路
- 按序读取所给的序列
- 若读入的数字大于当前栈内最大数,则逐1进栈,直到和所读数相等;
- 判断栈大小是否超过限制,注意此时栈顶元素不计数;
- 若读入的数字小于当前栈内最大数,则逐1出栈,直到栈顶和所读数相等;
- 若一轮循环后,栈大小超过限制或栈内仍有数字,则不能得到此序列。
注意:每次循环可以一次读入整个序列;也可一个一个读,但总是要将此行读完,如代码中所提示的。
// 考试版 用数组模拟栈
// A1051 Pop Sequence
#include <cstdio>
const int maxn = 1020;
int st[maxn], pointer = -1, size;
int main() {
int n, m, k;
scanf("%d%d%d", &m, &n, &k);
int num;
while(k-- > 0) {
pointer = -1;
size = 0;
int j = 1;
bool flag = true;
for(int i = 0; i < n; i++) {
scanf("%d", &num);
while(j <= num) {
st[++pointer] = j++;
size++;
}
if(size > m) {
flag = false; // 这里不能简单的break掉。
}
// 从1开始压入栈,直到遇到要输出的数
while(st[pointer] == num && size > 0) { // 若下一个数比当前栈顶小,则出栈
pointer--;
size--;
}
}
if(!flag) printf("NO");
else if(size > 0) printf("NO");
else printf("YES");
printf("\n");
}
return 0;
}
/*************************************/
// PAT版
#include <vector>
#include <cstdio>
using namespace std;
const int maxn = 1020;
int main() {
int n, m, k;
scanf("%d%d%d", &m, &n, &k);
int num;
vector<int> st;
while(k-- > 0) {
st.clear();
int j = 1; // j记录当前出现过的最大数
bool flag = true;
// printf("%d: ", m-k);
for(int i = 0; i < n; i++) {
scanf("%d", &num);
while(j <= num) {
st.push_back(j++);
}
if(st.size() > m) {
flag = false;
}
// 从1开始压入栈,直到遇到要输出的数
while(st[st.size()-1] == num && st.size() != 0) { // 若下一个数比当前栈顶小,则出栈
// printf("%d ", st[st.size()-1]);
st.pop_back();
}
}
if(!flag) printf("NO");
else if(st.size() > 0) printf("NO");
else printf("YES");
printf("\n");
}
return 0;
}