1 条题解

  • 0
    @ 2026-10-11 18:07:48

    猜排列(easy)

    算法思路

    先确定一个位置的值,再利用两数之和恢复其他位置。

    首先询问 (1,2)(1,2)、(1,3)(1,3)、(2,3)(2,3),分别得到

    $$s_{12}=a_{1}+a_{2},\qquad s_{13}=a_{1}+a_{3},\qquad s_{23}=a_{2}+a_{3}.$$

    将前两个回答相加,再减去第三个回答,可以消去 a2,a3a_{2},a_{3}:

    s12+s13−s23=2a1.s_{12}+s_{13}-s_{23}=2a_{1}.

    因此,前三个位置的值为

    $$a_{1}=\frac{s_{12}+s_{13}-s_{23}}{2},\qquad a_{2}=s_{12}-a_{1},\qquad a_{3}=s_{13}-a_{1}.$$

    对于每个 i=4,5,…,ni=4,5,\ldots,n,询问 (1,i)(1,i)。设回答为 ss,则 ai=s−a1a_{i}=s-a_{1}。恢复所有位置后,输出整个排列。

    正确性证明

    前三次询问的回答满足上述等式,因此计算得到的 a1,a2,a3a_{1},a_{2},a_{3} 均为真实值。

    对于其余位置 ii,询问返回 s=a1+ais=a_{1}+a_{i}。由于 a1a_{1} 已被正确确定,故 s−a1s-a_{1} 恰好等于真实的 aia_{i}。

    因此,算法能够正确恢复整个排列。

    复杂度分析

    前三个位置使用 33 次询问,其余 n−3n-3 个位置各使用一次询问,总询问次数为

    3+(n−3)=n,3+(n-3)=n,

    满足题目限制。

    时间复杂度为 O(n)O(n),存储整个排列的空间复杂度为 O(n)O(n)。

    • 1

    信息

    ID
    715
    时间
    1000ms
    内存
    256MiB
    题目 Rating
    待评级
    标签
    (无)
    递交数
    42
    已通过
    13
    上传者