题目描述
有 n节车厢从 A 方向驶入车站,按进站顺序编号为1…n 。
你的任务是让他们按照某中特定的顺序进入 B 方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站 C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入 C 的车厢必须按照相反的顺序驶出 C。对于每个车厢,一旦从 A 移入 C,就不能再回到 A 了;一旦从 C 移入 B,就不能回到 C 了。换句话说,在任意时刻,只有两种选择:A->C 和 C->B。
现在需要你写一个程序,判断给定的 B 方向驶出车站的车箱顺序是否可行,若不可行输出 ‘no’;若可行则输出 ‘yes’,并输出要能得到这个出站顺序,中转站 C 至少需要几个存放车厢的位置。
输入格式
第 1 行一个整数 n,表示有 n节车厢;
第 2 行 n个整数,是 1…n 的排列,表示 B 方向驶出的车厢顺序。
输出格式
若 B 方向出站车厢顺序不可行输出 “no”,若可行,则输出 “yes”,并在第二行输出中转站至少要提供车厢位置数。
样例
输入样例
5
1 2 3 4 5
输出样例
yes
1
数据范围与提示
n<10000
#includeusing namespace std; int main(){ freopen("B.in","r",stdin); freopen("B.out","w",stdout); int n,num[10000],index=0,maxSize=0; stack stk; cin>>n; for(int i=0;i >num[i]; for(int i=0;i stk.push(i+1); maxSize=max(maxSize,(int)stk.size()); while(!stk.empty()&&stk.top()==num[index]){ stk.pop(); index++; } } if(stk.empty()){ cout<<"yesn"< cout<<"no"; } return 0; }



