【公司】约瑟夫环问题-递归解法

公司oj-鱿鱼游戏-年会大奖

题目描述

公司绝对按照最近很火的《鱿鱼游戏》一样,再年会上设置一个只有一个人能获得的超级大奖。

游戏规则如下:

参与抽奖的总共有m人,按照1-m号围成一个大圈。

从编号1开始报数,当报到N的时候,将该人淘汰。然后从下一个人开始,继续从1开始报数,到N时被淘汰,直到只剩一人时,获得大奖。

如果你想获得大奖,你得在第一时间 抢占哪个编号才行?

输入

输入只有一行 包含两个整数 分别为m和n
M代表参赛的总人数 所有人按照1-M编号
N代表疏导N时被淘汰

1<m<0x7fffffff
1<n<0x7fffffff

输出

输出最终会获胜的那个编号

样例输入

10 7

样例输出

9

提示

输入m可能是一个非常大的数值 这个时候怎么才能快速找到结果
该题中包含了 可能需要使用复杂度为 O(N)的方法才能在满足时间和内存的条件下,获得结果

如果只能完成50% 可以尝试已在在 m*n 大于 10^10的情况下 程序是否能在5秒内完成

解析

本题是约瑟夫环的一个考察,如果直接保存每一个人的状态按照顺序一步步模拟的话,会因为超时或者内存超限导致失败。
使用递归需要注意递归有爆栈的风险。

。。。

#include <bits/stdc++.h>

using namespace std;

/**
    只要 m >> n,算法的时间复杂度就只有 O(1) ,否则就退化为原来的递归算法
*/
int f1(int m, int 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值