洛谷P1125——笨小猴(简易模拟)
时间: 2023-07-19 08:33:08 浏览: 159
这是一道模拟题,题目描述如下:
有 n 个猴子,按顺序编号为 1,2,3,…,n。这 n 只猴子按顺序围成一圈。从第 1 只猴子开始数,数到第 m 只猴子,把它踢出圈,剩下的猴子重新围成一圈,继续从第 1 只猴子开始数,直到只剩下一只猴子为止。问最后剩下的猴子编号是多少?
下面是解题思路:
首先,我们可以用一个数组来表示每只猴子,用一个变量表示当前轮到的猴子的编号。每次数到第 m 只猴子,就将它从数组中删除(将它对应的元素置为 0),同时更新当前轮到的猴子的编号。如果数组中只剩下一只猴子,就输出它的编号。
具体实现可以参考下面的代码(C++实现):
```
#include <iostream>
using namespace std;
const int maxn = 10000;
int a[maxn]; // 存储猴子编号的数组
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
a[i] = i + 1; // 初始化猴子编号
}
int cur = 0; // 当前轮到的猴子的编号
while (true) {
int cnt = 0; // 当前轮已经数了几只猴子
for (int i = 0; i < n; i++) {
if (a[i] != 0) { // 如果这只猴子还没被踢出圈
cnt++;
if (cnt == m) { // 数到了第 m 只猴子
a[i] = 0; // 踢出圈
cnt = 0; // 重新开始计数
}
if (a[i] != 0) {
cur = i; // 更新当前轮到的猴子的编号
}
}
}
int sum = 0; // 统计剩下的猴子数量
int last = 0; // 记录最后一只猴子的编号
for (int i = 0; i < n; i++) {
if (a[i] != 0) {
sum++;
last = a[i];
}
}
if (sum == 1) { // 只剩下一只猴子了
cout << last << endl; // 输出它的编号
break; // 结束循环
}
}
return 0;
}
```
希望能够帮助你解决这道题目!
阅读全文