Uva514 Rails

原题英文版PDF

对题意有不理解的建议直接看英文原版,描述更细致

中文题意 

某城市有一个火车站,铁轨铺设如图。有n节车厢从A方向驶入车站,按进站的顺序编号为1~n。你的任务是判断是否能让他们按照某种特定的顺序进入B方向的铁轨并驶出车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但(5 4 3 2 1)是可能的。 为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每节车厢,一旦从A移入C,就不能返回A了;一旦从C移入B,就不能返回C了。也就是说,在任意时刻,只有两种选择:A到C和C到B。

对于每一组数据,第一行是一个整数 N 。接下来若干行数据,每行 N 个数,代表 11 ~ N 车厢的出栈顺序,最后一组数据只有一个整数 0。对于每一组数据,在最后输出空行。

最后一组数据的 N=0 ,不输出。

n<=1000

输入输出样例

输入 

5
1 2 3 4 5
5 4 1 2 3
0
6
6 5 4 3 2 1
0
0

输出 

Yes
No

Yes

 题意分析:

本题是对栈Stack先进后出的特点考察的经典例题

对于一个从小到大的序列,如果当数k已经出栈了,那么比数k小的一定入栈了,并且在栈里的顺序也是满足从栈顶到栈底是从大到小的顺序的

那么我们可以模拟整个出栈顺序:遍历题目给的出栈顺序,假如遍历到了k,表示k已经出栈了,把不比k大的数字(比k小和k自己)且还未入栈的数字全部按照顺序入栈(用a表示哪些数字入栈了),然后判断此时栈顶的元素是不是k,如果不是说明顺序是错的

因为如果是栈顶元素,就能顺序是满足入栈出栈规则的,是可以实现的,如果不是就说明有问题;

所以本题的思路:就是已知一个数字集合的初始序列,然后问能否通过栈来改变顺序,能符合题目给出的测试序列,如果能就输入Yes,如果不能就输出No,所以题目的核心代码就是实现一个Stack的判断规则,这个规则有很多条,任选一条实现就可以

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    //题目会给出多组测试数据,不知道具体的组数所以就把读入放在while循环里,并且读入的n不能是0
    while (cin >> n && n)
    {
        stack<int> s;
        int b[n + 1];
        //给出的测试数据也不知道多少个所以就用while(1)+break来实现
        while (1)
        {
            bool flag = true;
            int a=1;
            cin >> b[1];
            //break的条件
            if (b[1] == 0)
                break;
            else
            {
                for (int i = 2; i <= n; i++)
                    cin >> b[i];
                //核心代码
                for (int i = 1; i <= n; i++)
                {
                    //遍历,此时b[i]为第i个出栈的
                    int k = b[i];
                    //判断比k小的还没入栈的
                    while(k>=a)
                        s.push(a++);
                    //如果栈顶和k相等,说明k之前的都是符合栈规则的
                    if(k == s.top())
                        s.pop();
                    else
                    {
                        flag = false;
                        break;
                    }
                }
                //注意No和Yes的大小写
                if (!flag)
                    cout << "No" << endl;
                else
                    cout << "Yes" << endl;
            }
        }
        cout<<endl;
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linengcs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值