1 条题解

  • 2
    @ 2024-6-28 21:30:26

    Standard Solution.

    第一部分

    上述代码的最坏时间复杂度是 O(nTlogn)O(nT \log n)

    第二部分

    为了证明中间的小猪不会出现左右往复移动而使时间复杂度达到 O(n2T)O(n^2T) 的情况,我们考虑把场上所有的小猪从左向右平分成三分,分别记为 A,B,CA,B,C

    根据题意,在 A,B,CA,B,C 中都至少有一只小猪还没下桥的情况下,AA 中的小猪总会向左移动,而 CC 中的小猪总会向左移动。T2\dfrac{T}{2} 秒后,AA 中任意一只小猪和 CC 中任意一只小猪之间的距离将不小于 TT,因此它们之间一定有一组全部下桥了。

    由上可知,时间每过去 T2\dfrac{T}{2} 秒,桥上小猪的数量都将至少减少 13\dfrac{1}{3},即剩下原来的 23\dfrac{2}{3} 或更少。因此,整个过程最多持续 $\dfrac{T}{2} \cdot \log _{\frac{3}{2}} n=O(T \log n)$ 秒。

    阅读程序可知,它 while 循环内程序的时间复杂度为 O(n)O(n),而 while 循环每执行一次相当于时间流逝一秒,因此 while 循环最多会执行 O(Tlogn)O(T \log n) 次。

    综上,上述代码的时间复杂度不高于 O(nTlogn)O(nT \log n)

    第三部分

    只要让 TT 远大于 nn(此时可以忽略 nn 对小猪位置的影响),且 T,nT,n 足够大,将 nn 只小猪都放在 T3\dfrac{T}{3} 位置(时间每过去 T3\dfrac{T}{3} 秒,桥上小猪的数量都将减少 12\dfrac{1}{2}),即可使上述代码的时间复杂度退化到 O(nTlogn)O(nT \log n)

    例如:

    • n=106n=10^6
    • T=3×1018T=3 \times 10^{18}
    • ai=1018+ia_i=10^{18}+i
    • 1

    信息

    ID
    5
    时间
    1000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    12
    已通过
    4
    上传者