UVA - 514 Rails

来源:互联网 发布:crossover软件 编辑:程序博客网 时间:2024/06/18 16:38
#include <cstdio>
#include <stack>


using namespace std;
const int MAXN = 1000 + 10;


int n, target[MAXN];


int main()
{
    while(~scanf("%d", &n) && n)
    {
        while(~scanf("%d", &target[1]) && target[1])
        {
            stack<int> s;
            int A = 1, B = 1;
            for(int i = 2; i <= n; i++)
                scanf("%d", &target[i]);
            int ok = 1;
            while(B <= n)
            {
                if(A == target[B]) { A++; B++; } //若满足输入所示要求,则直接到B端
                else if(!s.empty() && s.top() == target[B]) { s.pop(); B++; } //若不满足且栈不为空,则出栈
                else if(A <= n) s.push(A++); //若不满足且栈为空,则入栈
                else { ok = 0; break; } //若三个都不满足则说明无法重组,ok = 0
            }
            printf("%s\n", ok ? "Yes" : "No");
        }
        printf("\n");
    }
    return 0;

}

心得:刚做这题时感觉有别的做法,就搜了下报告,结果网上基本都是一样的做法,就是改了个变量名= =,面对这种现象,我只想说,玩一两次还是可以的,玩多了就没意思了。。。

回归正题,LRJ大牛的代码还是一如既往的无可挑剔,选择、条件和变量都用的恰到好处,实在佩服。。。

借这道题我也发表下我自己对栈的理解:本来想按照别的做法,因为这无非就是两个有序数列的组合嘛。后来想想不对,第一个不符合的元素永远不可能排在第二、三个不符合元素的前面。然后想用下别的方法限制下,没想出来= =,看来栈就是前人为了解决这样的问题而留给我们的宝贵遗产,这也就是所谓的数据结构!!!刚开始我还不信,试了几组数据才体会到栈的精妙,拿1,2,3,4,5的例子来说,输出5,4,3,2,1、4,5,3,2,1、3,4,5,2,1,只要出栈顺序是可能的,凡是不满足第一个条件的全满足第二个条件,相当于两个数列按照题目所给方式合并,这完全不是凭空能想出来的算法。总之相当于有条件数列合并的简化版,大大简化了我们的算法~

感想虽不多不过还是想写出来,不喜轻喷= =

补充下,LRJ的代码有点问题,想必是想让我们好好看代码吧= =


0 0