题目是PDF文档不便复制,直接上网址:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=455
直接维护一个栈,对于进入的一边,若首位恰等于当前所需要的元素,则直接过去,否则入栈。若栈顶元素等于所需元素,则出栈,直到元素全部找完。
下面上代码:
#include<bits/stdc++.h>
#define N 1005
using namespace std;
int n,a[N];
int main(){
while(scanf("%d",&n)&&n){
while(scanf("%d",&a[1])&&a[1]){
for(int i=2;i<=n;i++)
scanf("%d",a+i);
stack<int> s;
int now=1,cnt=1;
while(now<=n){
if(s.size()&&a[now]==s.top()){//栈中有元素且等于目标出栈元素
s.pop();//直接出栈
now++;//访问下一个
}
else if(a[now]!=cnt){//不能对上号,先进栈
s.push(cnt);
if(++cnt>n)//若超过n则不可能,直接break
break;
}
else{
now++;
cnt++;
}
}
if(now>n)
puts("Yes");
else
puts("No");
}
puts("");
}
return 0;
}