题目描述
公司绝对按照最近很火的《鱿鱼游戏》一样,再年会上设置一个只有一个人能获得的超级大奖。
游戏规则如下:
参与抽奖的总共有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

最低0.47元/天 解锁文章
1万+

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



