专栏文章

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

B4246题解参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@mipvi7zx
此快照首次捕获于
2025/12/03 18:37
3 个月前
此快照最后确认于
2025/12/03 18:37
3 个月前
查看原文

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

Source & Knowledge

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

文字题解

题目描述了一种环形游走的方式,老师从第 11 号小朋友开始,按照逆时针方向,移动 mm 次,每次的步数由当前位置小朋友衣服上的数字决定。由于小朋友是围成一圈的,因此当位置小于 11 时,需要回到最后一个小朋友。
首先按照题目要求读入 n,mn, maa 数组:
CPP
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 为止。
    CPP
    while (pos <= 0) {
       pos += n;
    }
    
  • 进行 mm 次移动后,最终位置即为答案。
CPP
int pos = 1;
for (int j = 1; j <= m; j++) {
    pos -= a[pos];
    while (pos <= 0) pos += n;
}
cout << pos << endl;

评论

2 条评论,欢迎与作者交流。

正在加载评论...