描述
有n只猴子围成一圈,每个有一个编号,编号从1到n。打算从中选出一个大王。经过协商,决定选大王的规则如下:从第一只开始,每隔m只,数到的猴子出圈,最后剩下来的就是大王。
输入
输入为一行两个数,即n,m。
输出
输出最后剩下来的猴子序号。
输入样例
8 4输出样例
6
循环链表是指最后一个空间指向头节点的链表类型,可以用于需要在多个数据之间来回循环的题目,比如约瑟夫问题(上面这道就是约瑟夫问题的改版)。普通约瑟夫问题可以用数组做,如上面这道题,用数组做就是这样:
#include<iostream>
using namespace std;
bool b[10000];
int main()
{
int js=0,djs=0,i,n,m;
cin>>n>>m;
for(i=1;i<=n;i++)b[i]=true;
i=1;
while(djs<n-1)
{
if(i>n)i=1;//判断是否越界
if(b[i])js++;//判断这个点有没有出圈
if(js==m)//判断是否数到m
{
js=0;
b[i]=false;
djs++;
}
i++;
}
for(i=1;i<=n;i++)
if(b[i])
{
cout<<i;
break;
}
return 0;
}
有没有注意到,需要判断的次数太多了!这样一旦n和m大起来,TLE是不可避免的。我们可以观察一下,程序主要耗时的地方是判断点有没有出圈、判断是否数到

本文介绍了使用循环链表解决约瑟夫问题的一个变种——猴子选大王,该问题要求从编号1到n的猴子中,每隔m只淘汰一只,最终找出剩下的一只猴子(大王)。通过分析,提出循环链表能够有效减少判断次数,提高效率,满足题目要求的条件。并给出了循环链表的代码实现。
最低0.47元/天 解锁文章
5641

被折叠的 条评论
为什么被折叠?



