专栏文章
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 月的语言月赛,主要考察简单一维数组的运用。
文字题解
题目描述了一种环形游走的方式,老师从第 号小朋友开始,按照逆时针方向,移动 次,每次的步数由当前位置小朋友衣服上的数字决定。由于小朋友是围成一圈的,因此当位置小于 时,需要回到最后一个小朋友。
首先按照题目要求读入 和 数组:
CPPint a[5005]; // n 最大是 5000,因此这里开的比 5000 略大一些。
// 一般建议定义全局数组,即,上述语句建议写在 main 函数外
int n, m;
// main 函数内
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
之后,我们可以使用一个 变量,记录老师的位置。老师的起始位置是 号小朋友,因此 初始值为 。
接下来模拟移动过程。我们循环做 次如下操作:
-
读取当前位置小朋友衣服上的数字 ,计算新的位置。
-
由于是逆时针移动,每次移动 步,新的位置计算方式如下:
-
如果 ,表示已经超出了第 号小朋友,需要重新回到小朋友处。方法是,将 加上若干个 ,直到 重新回到 的范围内。【坑点】此处的一个坑点是,因为 很有可能远大于 ,所以只在 上加一个 是不够的。我们需要不断在 上 ,直到 不再 为止。CPP
while (pos <= 0) { pos += n; } -
进行 次移动后,最终位置即为答案。
int pos = 1;
for (int j = 1; j <= m; j++) {
pos -= a[pos];
while (pos <= 0) pos += n;
}
cout << pos << endl;
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...