题目
一群猴子要选新猴王。新猴王的选择方法是:让 N N N 只候选猴子围成一圈,从某位置起顺序编号为 1 N 1~N 1 N 号。从第 1 1 1 号开始报数,每轮从 1 1 1 报到 3 3 3,凡报到 3 3 3 的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式
输入在一行中给一个正整数 N ( ≤ 1000 ) N(≤1000) N(≤1000)。
输出格式
在一行中输出当选猴王的编号。
输入样例
11
输出样例
7
题解
解题思路
使用队列(先进先出)存储,先输入猴子个数,然后将这些猴子按照序号存入队列中,利用 f o r for for 循环判断,如果序号是 3 3 3 的倍数,则将该猴子删除,反正将该猴子放到队列末尾,直到队列中只有一个猴子,直接对应的猴子输出即可。
完整代码
#include<queue>
#include<iostream>
using namespace std;
int main(void)
{
int m, temp;
queue<int> s;
cout << "请输入猴子个数:"; // 提交时注释此行
cin >> m;
for (int i = 1; i <= m; i++)
s.push(i);
for (int i = 1; s.size() > 1; i++)
{
if (i % 3 == 0)
s.pop();
else
{
temp = s.front();
s.pop();
s.push(temp);
}
}
cout << s.front() << endl;
return 0;
}