美文网首页
车厢排序

车厢排序

作者: aladdinwang | 来源:发表于2018-06-12 00:39 被阅读0次

    一列火车有n个车厢标记为1,2,3,4,5,6…n
    现在因为某些原因,需要调整车厢的相对顺序
    例如需要将车厢顺序调整为2,3,1,4,5,6…n
    由于车厢庞大,且车厢只能停留在铁轨上,所以不能随心所欲的调整相对顺序

    现在只能利用两条并行的铁轨对车厢的顺序进行调整
    例如
    原序列为1,2的车厢
    车厢1进入铁轨1停止
    车厢2进入铁轨2,然后再开出
    然后铁轨1上的车厢1再开出
    这样可以使得车厢2调整到车厢1得前面

    现在给你一个期望得到的车厢顺序,请你判断该顺序能否通过以上方法调整车厢顺序而得到
    (车厢只能前进无法后退)
    输入格式
    第一行n表示有n个车厢
    第二行有n个数为1~n的排列用空格隔开,表示期望得到的车厢顺序

    输出:若可以得到则输出Yes 否则输出No

    样例输入1:
    2
    2 1
    样例输出1:
    Yes

    样例输入2:
    5
    3 4 1 5 2
    样例输出2:
    Yes

    样例输入3:
    5
    3 4 2 1 5
    样例输出3:
    No


    个人分析:

    比如样例输入2:
    5
    3 4 1 5 2
    样例输出2:
    Yes

    图解题意:


    这里写图片描述

    车厢1、2进入铁轨2,车厢3、4、5进入铁轨1,铁轨就像队列一样,先进先出


    这里写图片描述

    车厢5先停留下来,铁轨2的车厢1先行开出:


    这里写图片描述

    然后车厢5先出,车厢2最后开出即可。

    而样例输入3:
    5
    3 4 2 1 5
    样例输出3:
    No

    开始


    这里写图片描述

    车厢1、2进入铁轨2,车厢3、4、5进入铁轨1,铁轨就像队列一样,先进先出


    这里写图片描述

    然而车厢3、4车厢出来之后,车厢2无法开出,所以这个顺寻不可行:


    这里写图片描述

    故不可以做到,输出No。

    # coding: utf-8
    
    from collections import deque
    def feasible(a, b):
        q1 = deque()
        q2 = deque()
    
        def find(x):
            for q in [q1, q2]:
                if q and q[0] == x:
                    q.popleft()
                    return True
            if not a or x < a[0]:
                return False
            if all((q1, q2)):
                return False
    
            q = filter(None, [q1, q2])
            if not q:
                q = q1
    
            i = x - a[0]            
            q.extend(a[:i])
            del a[:i+1]
            return True
        for x in b:
            if not find(x):
                return False
            
        return True
    
    
    print feasible(range(1, 6), [3, 4, 2, 1, 5])
    print feasible(range(1, 6), [3, 4, 1, 5, 2])
    
    

    相关文章

      网友评论

          本文标题:车厢排序

          本文链接:https://www.haomeiwen.com/subject/noikeftx.html