样例(包括官网41行那个)全过了
我寻思着n<=1000 数组开10100总不至于越界吧
难不成是栈溢出?
代码如下
#include<iostream>
#include<stack>
using namespace std;
stack <long long> z,b;
long long n,a[10100],j;
bool bj,bj1,c[10100];
int main(){
while(1){
cin>>n;
if(n==0) break;//当此数据点完成
for(int i=n;i>=1;i--) b.push(i);//初始化A车站
while(1){
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==0){//当此组数据完成
cout<<endl;
bj1=1;
break;
}
}
if(bj1){
bj1=0;
break;
}
for(int i=1;i<=n;i++){
if(c[a[i]]){//当目标车厢在C
if(z.top()!=a[i]){//当目标车厢在C且不在C顶时则一定无法把目标车厢移到指定位置
cout<<"No"<<endl;
break;
}
else{//将目标移至B,不再考虑
z.pop();
c[a[i]]=0;
}
}
else{//当目标车厢在A
if(z.empty()){//防止栈空
z.push(b.top());
c[b.top()]=1;
b.pop();
}
while(z.top()!=a[i]){//贪心,持续将A中车厢移至C直到目标车厢在C顶部
z.push(b.top());
c[b.top()]=1;
b.pop();
}
c[a[i]]=0;
z.pop();
}
}
if(z.empty()) cout<<"Yes"<<endl;//当C空时则所有车厢在指定位置
else{//重置栈
while(!z.empty()) z.pop();
while(!b.empty()) b.pop();
while(c[++j]) c[j]=0;
j=0;//重置辅助变量
}
for(int i=n;i>=1;i--) b.push(i);//重置A车站
}
}
return 0;
}