第4章-18 猴子选大王 (20分)

本文解析了一种猴子选大王的算法,通过循环报数淘汰猴子直至选出猴王。输入猴子数量,输出最终猴王的编号。文章提供了两种实现思路及代码示例,一种通过动态调整数组移除被淘汰的猴子,另一种简洁地将每轮淘汰的第三个猴子后的前两只猴子移到数组末尾。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第4章-18 猴子选大王 (20分)

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:
输入在一行中给一个正整数N(≤1000)。

输出格式:
在一行中输出当选猴王的编号。

输入样例:
11
输出样例:
7
数组里去掉3的倍数
思路没问题,但代码一开始把自己绕得小晕

n = int(input())
s = [i for i in range(1,n+1)]
yu = 0 #开始余数默认0
while len(s)>1:
    tmp,yu = yu,(len(s)+yu)%3#去掉 余数 加 3的倍数
    for i in range(len(s)-1,-1,-1):#尾部开始去
        if (i+1+tmp)%3==0:
            s.remove(s[i])
print(s[0])

大佬的思路,简洁明了,先把第三个毙了,然后把前两个移到最后面,重新组成一个数组
下面是抄的大佬代码

n=int(input())
s=[i for i in range(1,n+1)]
while len(s) >= 3:
    s = s[3:]+s[0:2]#去掉第三个,把前两个移到最后面
s=s*2 #防止只有一个情况,反正两个乘了也没毛病
print(s[1])
### 关于猴子大王加强版的算法实现 猴子大王问题是一个经典的约瑟夫环问题变体。以下是针对该问题的一种优化解法及其代码实现。 #### 1. 约瑟夫环问题简介 约瑟夫环问题是计算机科学中的经典问题之一,描述了一组对象按照一定规则逐步淘汰的过程。对于给定的 `n` 和 `m` 参数,可以通过循环链表或数学推导的方式解决这个问题[^1]。 #### 2. 加强版算法析 在传统版本的基础上,“加强版”的核心在于提高效率并支持更大的数据规模。传统的基于数组的方法可能无法处理非常大的输入范围(如百万级别的 `n` 值)。因此,采用 **递归公式** 是一种更高效的解决方案: 设函数 \( f(n, m) \) 表示当有 n 只猴子时最终剩下的是哪只猴⼦的编号,则其递推关系为: \[ f(n, m) = (f(n-1, m) + m) \% n \] 其中初始条件为 \( f(1, m) = 0 \)[^1]。 这种递推公式的计算复杂度仅为 O(n),非常适合大规模的数据场景。 #### 3. Python 实现代码 下面是使用 Python 编写的高效实现代码: ```python def find_king_monkey(n, m): """ 使用递推公式求解约瑟夫环问题 :param n: 总共有多少只猴子 :param m: 数到几被移除 :return: 最终剩下的猴子编号 """ pos = 0 for i in range(2, n + 1): pos = (pos + m) % i return pos + 1 # 返回实际编号(从1开始) # 测试用例 if __name__ == "__main__": n = 10 # 猴子总数 m = 3 # 每轮数到3被移除 king = find_king_monkey(n, m) print(f"总共有{n}只猴子,每轮数到{m}被移除,最后的大王是第{king}号猴子") ``` 以上代码通过迭代实现了递推公式,时间复杂度为 O(n),空间复杂度为 O(1)[^1]。 #### 4. PHP 实现代码 如果需要使用 PHP 来解决问题,也可以参考如下代码: ```php <?php function find_king_monkey($n, $m) { $pos = 0; for ($i = 2; $i <= $n; ++$i) { $pos = ($pos + $m) % $i; } return $pos + 1; // 返回实际编号(从1开始) } // 测试用例 $n = 10; // 猴子总数 $m = 3; // 每轮数到3被移除 $king = find_king_monkey($n, $m); echo "总共有{$n}只猴子,每轮数到{$m}被移除,最后的大王是第{$king}号猴子"; ?> ``` 这段代码同样利用了递推公式来减少内存占用和提升性能[^1]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值