1 条题解

  • 0
    @ 2025-8-24 21:18:07

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Maxmilite
    **

    搬运于2025-08-24 21:18:06,当前版本为作者最后更新于2025-03-19 17:00:44,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    [语言月赛 202503] 环形游走 题解

    Source & Knowledge

    本题来源于 2025 年 3 月的语言月赛,主要考察简单一维数组的运用。

    文字题解

    题目描述了一种环形游走的方式,老师从第 11 号小朋友开始,按照逆时针方向,移动 mm 次,每次的步数由当前位置小朋友衣服上的数字决定。由于小朋友是围成一圈的,因此当位置小于 11 时,需要回到最后一个小朋友。

    首先按照题目要求读入 n,mn, maa 数组:

    int a[5005]; // n 最大是 5000,因此这里开的比 5000 略大一些。
    // 一般建议定义全局数组,即,上述语句建议写在 main 函数外
    int n, m;
    
    // main 函数内
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    

    之后,我们可以使用一个 pos\text{pos} 变量,记录老师的位置。老师的起始位置是 11 号小朋友,因此 pos\text{pos} 初始值为 11

    接下来模拟移动过程。我们循环做 mm 次如下操作:

    • 读取当前位置小朋友衣服上的数字 aposa_{\text{pos}},计算新的位置。

    • 由于是逆时针移动,每次移动 aposa_{\text{pos}} 步,新的位置计算方式如下:

      pos=posapos\text{pos} = \text{pos} - a_{\text{pos}}
    • 如果 pos0\text{pos} \leq 0,表示已经超出了第 11 号小朋友,需要重新回到小朋友处。方法是,将 pos\text{pos} 加上若干个 nn,直到 pos\text{pos} 重新回到 1n1 \sim n 的范围内。

      坑点】此处的一个坑点是,因为 aposa_{\text{pos}} 很有可能远大于 nn,所以只在 pos\text{pos} 上加一个 nn 是不够的。我们需要不断在 pos\text{pos}+n+ n,直到 pos\text{pos} 不再 0\leq 0 为止。

      while (pos <= 0) {
         pos += n;
      }
      
    • 进行 mm 次移动后,最终位置即为答案。

    int pos = 1;
    for (int j = 1; j <= m; j++) {
        pos -= a[pos];
        while (pos <= 0) pos += n;
    }
    cout << pos << endl;
    
    • 1

    信息

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