- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
上周我参加了 Facebook 黑客杯的第 1b 轮比赛。
问题之一基本上是 Josephus problem
我之前把约瑟夫斯问题当成离散数学问题研究过,所以我基本上明白了如何得到递归:
f(n,k) = (f(n-1,k) + k) mod n, with f(1,k) = 0
但这在 Facebook 黑客杯中不起作用,因为 n 的最大值为 10^12。 k 的 mak 值为 10^4。
维基百科提到了一种k小n大的方法。基本上从单轮中移除人员,然后重新编号。但它没有太多描述,我不明白为什么重新编号有效。
我查看了该解决方案的示例工作源代码,但我仍然不理解最后一部分。
long long joseph (long long n,long long k) {
if (n==1LL) return 0LL;
if (k==1LL) return n-1LL;
if (k>n) return (joseph(n-1LL,k)+k)%n;
long long cnt=n/k;
long long res=joseph(n-cnt,k);
res-=n%k;
if (res<0LL) res+=n;
else res+=res/(k-1LL);
return res;
}
我真正不明白的部分是从 res-=n%k
开始(以及之后的几行)。您如何推导出这是调整结果的方式?
有人可以说明这是如何得出的背后的推理吗?或者派生它的链接?(我没有在 UVA 或 topcoder 论坛上找到任何信息)
最佳答案
好吧,我想我破解了它。
让我们看看 n=10,k=3 时的迭代情况:
0 1 2 3 4 5 6 7 8 9 n=10,k=3
1 2 3 4 5 6 0 n=7,k=3
观察第二次迭代的元素如何映射到第一次迭代:它们被 n%k
转置,因为圆环绕。这就是我们通过减去 10%3
来更正结果的原因。第二行中的数字以 k-1
为一组出现,因此通过 res/(k-1)
进行更正。
另一种情况在迭代中被进一步击中
0 1 2 3 4 n=5,k=3
2 3 0 1 n=4,k=3
现在 j(4,3) 返回 0,经过 5%3
修正后结果为 -2。只有当第二行的结果在最后一组时才会发生这种情况,在这种情况下,将 n
添加到结果中将得到我们的原始索引。
关于algorithm - Josephus for large n(Facebook 黑客杯),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4845260/
我已经尝试了一段时间,但我不知道如何让下面的程序以 N 作为输入并生成 M ,以便最后死去的士兵是第 13 个(N>13); int main() { int N, M; struct nod
josephus problem可以是solved通过以下递归: josephus(n, k) = (josephus(n - 1, k) + k-1) % n + 1 josephus(1, k
我在上数据结构课,无法重现教师给出的示例数据。该问题是经典的 Josephus 问题,其中包含用户提供的成员数量、步长间隔和起始位置。 具体来说,我被告知有 99 人,从 23 人开始,数到 5 应该
约瑟夫斯问题(或约瑟夫斯排列)是与某种数数游戏相关的理论问题。 People are standing in a circle waiting to be executed. Counting beg
class Node { public int Data { get; set; } public Node Next { get; set; }
我正在尝试使用 java 中的队列来解决 Josephus 问题。输入必须是名称列表(字符串)和整数 k 或土 bean 已通过队列的次数。我需要测试 4 个不同的输入。这就是我到目前为止所拥有的,我
假设 100 人围成一圈。从第 1 人数到第 14 人,将此人移出圈子。按照数数顺序,再次数数,去掉第 14 个人。重复。最后站着的是谁? 我已经尝试了一切来解决这个问题,但它似乎无法处理死循环。
编辑:我似乎至少已经解决了错误,并更新了代码。然而,数学似乎仍然没有解决。有什么想法吗? 简而言之,我正在尝试用 C++ 编写一个程序,它会提示用户输入初始圈中的人数,然后告诉他们如果 k,他们应该站
我正在做一个基于 Josephus 问题和循环链表的作业。下面的函数在 Xcode 中给出了一个错误(Control reaches end of non-void function),我认为这意味着
我正在编写计算约瑟夫斯数的代码。我只是在试验这些数字以使代码正确。这是我写的代码: int answer(int n, int k) { if (n == 0) { retur
所以我在读Problem Solving Using Data Structures Python作者实现了一个队列来模拟著名的 Hot Pocket/Josephus 执行问题。但是,我认为这个实现
我最近偶然发现一个论坛声称可以使用数据结构在 O(n) 中解决 Josephus 问题。这里明确的选择是循环链表,但我声称它只能在 O(kn) 或 O(n^2) 中完成,除非你使用维基百科的数学递归/
上周我参加了 Facebook 黑客杯的第 1b 轮比赛。 问题之一基本上是 Josephus problem 我之前把约瑟夫斯问题当成离散数学问题研究过,所以我基本上明白了如何得到递归: f(n,k
在进行代码大战训练时,我遇到了关于约瑟夫排列的挑战,我尝试先在纸上解决它,然后再将其转化为代码。 问题如下:“创建一个返回 Josephus 排列的函数,将要排列的项目的初始数组/列表作为参数,就像它
我想知道是否有可能在 python 中使用列表来解决 Josepheus 问题。 简而言之,Josephus 问题就是在圆形排列中找到一个位置,如果使用事先已知的跳过参数处理执行,该位置将是安全的。
有没有办法在 O(n.logn) 中打印出 Josephus 问题中的移除顺序? 示例 人数为 n = 7,跳过人数为 k = 3。淘汰顺序为: 3, 6, 2, 7, 5, 1, 4 最佳答案 有一
我是一名优秀的程序员,十分优秀!