1 条题解

  • 1
    @ 2022-11-4 13:13:57

    来自出题人的题解

    大体上来看,这道题就是要将一个乱序的数列进行排序。所以我们要找的是一种可以在三个栈上面进行的排序:

    20分做法:
    圆盘数小于等于 1010 ,随便玩。

    40分做法:
    圆盘数小于等于 100100 ,考虑每次暴力的找出最大的圆盘放在最右边,单词操作期望为 O(n)O(n) ,操作总复杂度为 O(n2)O(n^2)

    70分做法:
    考虑其他 O(nlogn)O(n\log n) 的排序方法,我们只有两个空闲的柱子,所以排序应该和二进制或二分有关,考虑二进制基排,从最后一位开始考虑,当前位为0的放在B上面,当前位为1的放在C上面,最后全部放回A,但是移动 2n2n 次,进行logn\log n 次排序,总共操作数上限是 2nlogn2n\log n4000040000 会被卡掉。

    满分做法:
    考虑另一种排序方法:分治,将当先连续个盘子分成较大的和较小的两个均匀部分,分别进行处理。处理方式是:将一个段盘子从fro借助串las顺序/逆序移动到to上。自己手动推演一下顺序和逆序的过程,在这里就不给出。 考虑操作次数,我们可以让放在下方的一部分在完成之后直接移到to上,也就意味着单次操作总共移动了 32n\dfrac{3}{2}n 次,总共有 logn\log n 层递归,总操作数为 32nlogn\dfrac{3}{2}n\log n4000040000 可过。

    信息

    ID
    2
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者