| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1101 人关注过本帖
标题:约瑟夫(josephus)问题
只看楼主 加入收藏
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
 问题点数:0 回复次数:9 
约瑟夫(josephus)问题

一高人写的.
#include <iostream>

using namespace std;

int main()
{
int m;
int x;
cin >> m >> x;

int r = 0;
for (int i = 1; i <= m; ++i)
{
r = (r + x) % i;
}
cout << r + 1 << endl;
}

nb!!!!!!!!!!!!!!!!!!!!!!!!!!

搜索更多相关主题的帖子: 约瑟夫 josephus 
2007-08-21 19:21
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
什么意思````

这是C++的``

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2007-08-21 19:25
lijy520
Rank: 2
等 级:论坛游民
帖 子:119
专家分:42
注 册:2007-8-8
收藏
得分:0 

无论是用链表实现还是用数组实现都有一个共同点:要模拟整个

游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n

,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间

内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号,

而不是要读者模拟整个过程。因此如果要追求效率,就要打破常规,

实施一点数学策略。
为了讨论方便,先把问题稍微改变一下,并不影响原意:

问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出

,剩下的人继续从0开始报数。求胜利者的编号。

我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组

成了一个新的约瑟夫环(以编号为k=m%n的人开始):
k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2
并且从k开始报0。

现在我们把他们的编号做一下转换:
k --> 0
k+1 --> 1
k+2 --> 2
...
...
k-2 --> n-2
k-1 --> n-1

变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这

个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x

变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相

信大家都可以推出来:x‘=(x+k)%n

如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就

行了。(n-2)个人的解呢?当然是先求(n-3)的情况 ---- 这显然就是

一个倒推问题!好了,思路出来了,下面写递推公式:

令f[i]表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然

是f[n]

递推公式
f[1]=0;
f[i]=(f[i-1]+m)%i; (i>1)


2007-08-21 19:29
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2007-08-21 19:31
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
数学上可证明的,
2007-08-21 19:35
福尔摩斯
Rank: 5Rank: 5
等 级:贵宾
威 望:12
帖 子:4011
专家分:370
注 册:2006-8-15
收藏
得分:0 

把题目贴出来

贴代码做什么?

题目要先自己想过再看代码才有意义


自我放逐。。。
2007-08-21 19:46
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
以下是引用福尔摩斯在2007-8-21 19:46:36的发言:

把题目贴出来

贴代码做什么?

题目要先自己想过再看代码才有意义

这个不用贴题目了吧.随便哪本C语言讲链表都会有这个问题吧


2007-08-21 19:49
福尔摩斯
Rank: 5Rank: 5
等 级:贵宾
威 望:12
帖 子:4011
专家分:370
注 册:2006-8-15
收藏
得分:0 
以下是引用crackerwang在2007-8-21 19:49:29的发言:

这个不用贴题目了吧.随便哪本C语言讲链表都会有这个问题吧

我不知道约瑟夫(josephus)问题是什么东西

不记得了

回头去找找C的书好了

题干是什么都不记得了


自我放逐。。。
2007-08-21 19:51
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
就是有M个人从1到M标号围成一圈,从1开始数每数到R的人被踢出去.
问最后留下来的人的号码.

很佩服这个作者.自己当时从书上看了答案之后就从来没有想其他办法.

[此贴子已经被作者于2007-8-21 19:54:07编辑过]


2007-08-21 19:53
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
3楼写的很好

2007-08-21 19:54
快速回复:约瑟夫(josephus)问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014883 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved