1 条题解

  • 0
    @ 2025-8-24 21:15:55

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Maxmilite
    **

    搬运于2025-08-24 21:15:54,当前版本为作者最后更新于2024-01-21 23:03:10,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Source & Knowledge

    2024 年 1 月语言月赛,由洛谷网校入门计划/基础计划提供。

    题目大意

    给定池塘中的 nn 个位置和 n1n - 1 只小跳蛙(池塘中的空位用 00 表示)。每一次让相应编号的小跳蛙跳到池塘中的空位置上,一共跳跃 n1n - 1 次。求最终池塘中每个位置的小跳蛙编号。

    题目分析

    本题考察对数组结构的运用。

    可以注意到,第一次时 11 号小跳蛙跳到池塘中的 00 元素位置上,00 元素变为 1111 位置变为 00;第二次 22 号跳到当前的 00 元素位置上,即跳到初始时的 11 元素位置上。原来的 11 元素经过 1021 \to 0 \to 2 的变化。以此类推,最后一只小跳蛙会跳到初始时 n1n - 1 元素的位置上,n10nn - 1 \to 0 \to n,最终 nn 号元素的位置变为 00

    因此可以发现,对于池塘中除 nn 号元素位置以外的位置,其中的元素在整个跳跃流程结束后都变为了自身 + 1+ ~ 1。而 nn 号位置变为了 00

    因此在读入整个数组 a1,a2,,ana _ 1, a _ 2, \cdots, a _ n 后,从头开始输出 a1+1,a2+1,,an+1a _ 1 + 1, a _ 2 + 1, \cdots, a _ n + 1 即可,唯一需要注意的就是当 ai=na _ i = n 时需要输出 00

    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
    }
    for (int i = 1; i <= n; ++i) {
        if (a[i] != n) {
            cout << a[i] + 1 << " ";
        } else {
            cout << 0 << " ";
        }
    }
    

    从另一种角度考虑,对于某个位置 ii,其中的元素会在 aia _ i 撤走后变为 ai+1a _ i + 1(除 ai=na _ i = n 的情况外),因此也可以得到与上文一样的结论。

    视频讲解

    • 1

    信息

    ID
    9477
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者