题目描述:
把小于N1的所有元素push入栈(入栈时要判断:栈是否满),再把N1pop出来。
【注意:我们需要一个数组num来存放数字i是否入过栈,num[i]=1表示已经入过了,=0则没有】
对于序列的第n个元素:
和此时栈顶元素比较大小:
- 若等于此时的栈顶元素:把栈顶pop出来
- 若大于此时的栈顶元素:
- 把当前比栈顶元素小的值全都push进去(入栈时要判断:栈是否满)如果已经push过就不要再push了
- pop出栈顶元素
- 若小于此时栈顶元素:直接flag=false,输出NO
AC代码:
注意初始化!每组测试数据开始前要先把栈清空!
#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;
int compare(int x,int y){
if(x>y) return 1;
if(x<y) return -1;
return 0;
}
int main(){
bool flag=true;
stack<int> mystack;
char num[1002];
int a[1002];
int m,n,k,item;
cin>>m>>n>>k;
while(k--){
while(!mystack.empty()) mystack.pop();
flag=true;
memset(num,'0',1002);
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=1;i<=a[0];i++){
if(mystack.size()==m){//入栈前先判断:栈是否满
flag=false;
break;
}
mystack.push(i);
num[i]='1';
}
mystack.pop();
for(int i=1;i<n;i++){
if(mystack.size()==0) item=0;
else item=mystack.top();
switch(compare(a[i],item)){
case 0:
mystack.pop();
break;
case 1:
for(int t=1;t<=a[i];t++){
if(mystack.size()==m){
flag=false;
break;
}
while(num[t]=='1') t++;
mystack.push(t);
num[t]='1';
}
if(mystack.empty()){
flag=false;
break;
}
mystack.pop();
break;
case -1:
flag=false;
break;
}
if(flag==false) break;
}
if(!mystack.empty()) flag=false;
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}