栈的运用
解题思路:
用一个栈来模拟
1。栈为空时 判断需要填入的数 是否小于 栈的容量(即M)
2。若后一个数比前一个数大,又要push其之前的数 再判断
3。若后一个数比前一个数小,则要判断栈顶元素是否与其相等
#include<cstdio>
#include<stack>
#define MAXN 1010
using namespace std;
int M;
int N;
int K;
stack<int> s1;
int Num[MAXN];
bool flag = false;
void pushNum(int beginN, int endN){
for(int i = beginN; i <= endN; ++i)
s1.push(i);
}
void solve(){
int Tag = 0;
for(int i = 1; i <= N; ++i){
if(s1.empty()){
if((Num[i] - Tag) > M){
flag = true;
return;
}
pushNum(Tag + 1, Num[i]);
Tag = s1.top();
s1.pop();
}else if(Num[i] > Tag){
if((Num[i] - Tag) > (M - s1.size())){
flag = true;
return;
}
pushNum(Tag + 1, Num[i]);
Tag = s1.top();
s1.pop();
}else{
if(Num[i] != s1.top()){
flag = true;
return;
}
s1.pop();
}
}
}
int main(){
scanf("%d%d%d", &M, &N, &K);
while(K--){
flag = false;
while( !s1.empty() )
s1.pop();
for(int i = 1; i <= N; ++i){
scanf("%d", &Num[i]);
}
solve();
if(flag)
puts("NO");
else
puts("YES");
}
return 0;
}