UVA - 514

方法:

题目中的出站与入站跟stack的操作一致,故用stack来表示车站。

初始A面的顺序是从1到N,B面的顺序由题目中给出。

A面的每个车辆,只有两个选择,一个是正好对应此时B的首辆,二是进栈。

B的首辆要么是栈的top,要么是A的首辆。

两个变量,一个是此时B的首辆,一个是此时A的首辆。

所以可以一直循环,来使B的每一辆与A的首辆或者栈的top()一一对应,循环条件是B还有剩余的车辆。

AC代码:

#include <iostream>
#include <stack>
using namespace std;
const int maxn = 1000+10;
int main()
{
    int n;
    while(cin>>n&&n)
    {

        int dl[maxn];
        while(cin>>dl[0]&&dl[0])
        {
           for(int i=1;i<n;i++)
           cin>>dl[i];
           stack<int> stt;
           int id = 1;
           int len = 0;
           int flag = 1;
           while(len<n)
          {
            if(id==dl[len])
            {
                id++;
                len++;
            }
            else if(!stt.empty()&&stt.top()==dl[len])
            {
                stt.pop();
                len++;
            }
            else if(id<=n)
            {
                stt.push(id);
                id++;
            }
            else
            {
                flag = 0;
                break;
            }

          }
          if(flag)
                cout<<"Yes\n";
            else
                cout<<"No\n";
        }
        cout<<endl;
    }
    return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值