N人报数第M人出列游戏问题(约瑟夫问题)
这是一道华为的机试题,后来才知道也叫约瑟夫问题,题目是这样的:有n个人围成一圈,玩一个游戏,规则为将该n个人编号为1,2,......n, 从编号为1的人开始依次循环报数,报道第m的时候将第m个人从队伍中出列,然后从下一个人开始,又依次从1,2,....m报数,每次将报数为第m的人出列,直到最后只剩下1个人为止,则剩下的最后一個人获得游戏的胜利,现在给定n和m(n,m>0),让你求出哪位队员将获得游戏的胜利?
分析如下
假设每次队列的编号为:1, 2, 3......n,那么报数为m的人,编号应该为m % n,如下
1, 2, 3, ......m%n-1, m%n, m%n+1......n
我们取n=5, m=3为例,方便分析,则第一次报数情况为:
1, 2, 3, 4, 5
现在,报数应该从编号为4的人开始,咱们将整个队列重新编号为如下(应为下一轮报数第一个人应该为编号为4的人):
3, 4, 1, 2
由此可见,问题规模缩减为n=4, m=3的问题,继续进行如上的运算,依次为:
1, 2, 3
1, 2
1
最后问题化解为规模为n=1, m=3的问题, 此时毫无疑问,结果即为1, 那么各个问题的结果之间有没有关系呢?当然,是有的,我们将上述各个子问题的中间结果写成如下形式,方便发现规律(带下划线的表示该规模问题对应的报数为m的人,X表示为空):
1 2 3 4 5
3 4 X 1 2
X 1 X 2 3
X 1 X 2 X
X X X 1 X
可知最后结果为1, 但是其对应的列号为4,其实4就是问题的答案,那么如何得到4呢?事实上,每一步中间结果是有关系的,1推出2, 2推出2, 2推出1, 1推出4, 即得到了结果,至于如何推出的,接下来我们继续分析:
假设第i次的报数情景为:
1, 2, 3, ......m%n-1, m%n, m%n+1......n,
当:m%n <n-1
第i+1次的报数情景则应该为
n-m%n+1, n-m%n+2, n-m%n+3,...... 1, 2, ......n-m%n
任意一个两次都出现过的人,编号(设为B)关系有Bi = (Bi+1 + m%n) % n;
当:m%n = n-1时:
第i+1次报数的情景则为
1, 2, 3, ......m%n-1
任意一个两次都出现在队伍中的人,编号关系为Bi = Bi+1 + m%n
综合根据第i+1次结果得到第i次的结果表达式为:
Bi = (Bi+1 + m % n) %n == 0? Bi+1 + m%n : (Bi+1 + m % n) %n
用递归实现的C代码如下
#include <stdio.h>
int solve(int n, int m) {
int t;
if (n == )
return ;
return ((t= ((solve(n - , m) + m % n) % n)) == )?n:t;
}
int main(int argc, char **argv) {
int n, m, r;
scanf("%d %d", &n, &m);
r = solve(n, m);
printf("%d", r);
}
当然,递归效率还是比较低,这个转非递归的迭代很简单。
N人报数第M人出列游戏问题(约瑟夫问题)的更多相关文章
- BPM始终服务于人,落脚于人
数字经济时代下,云计算.大数据.移动互联已经成为当下企业必须采取的武装力量.随着互联网+.中国制造2025.工业4.0等国家战略的引导与支持,无数的企业在这场数字化浪潮中使尽浑身解数,想要抓住机遇奋力 ...
- git学习笔记11-git多人协作-实际多人怎么开发
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: $ git r ...
- git 操作 :从远程仓库gitLab上拉取指定分支到本地仓库;git如何利用分支进行多人开发 ;多人合作代码提交实践
例如:将gitLab 上的dev分支拉取到本地 git checkout -b dev origin/dev 在本地创建分支dev并切换到该分支 git pull origin dev 就可以把git ...
- 2016CCPC 合肥--最大公约数//每一年通向它的路上,多少人折戟沉沙,多少人功败垂成,有人一战成名,有人从头再来。
有这样一个有关最大公约数的函数:函数 f(x, y): { c=0 当 y>0: { c +=1 t = x % y x = y y = t } 返回 c * x * x} 给出三个正整数n,m ...
- 负载均衡--大型在线系统实现的关键(上篇)(再谈QQ游戏百万人在线的技术实现)
http://blog.csdn.net/sodme/article/details/393165 —————————————————————————————————————————————— 本文作 ...
- 类似于QQ游戏百万人同时在线的服务器架构实现
http://blog.csdn.net/sodme/article/details/213995 —————————————————————————————————————————————————— ...
- QQ游戏百万人同时在线服务器架构实现
转载自:http://morton5555.blog.163.com/blog/static/976407162012013112545710/# QQ游戏于前几日终于突破了百万人同时在线的关口,向着 ...
- 神贴真开眼界:为什么很多人倡导重视能力和素质,但同时对学历有严格要求?——代表了上一场比赛的输赢,招聘成本很重要。如果上一场游戏失败了,尽量让自己成为当前群体的尖子。学历只是其中的一个作品而已,但学历代表了学生时代为之做出的牺牲。人群自有偏向集中性 good
对于软件工程师职位,没学历没关系,如果真觉得自己才高八斗,请在简历里附上 github项目链接或者 appstore/google play上你的作品.如果学历比别人低,那么想必是把时间和精力用在了其 ...
- java解答:有17个人围成一圈(编号0~16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止,问此人原来的位置是多少号?
package ttt; import java.util.HashMap; import java.util.Map.Entry; /** * 有17个人围成一圈(编号0~16),从第0号的人开始从 ...
随机推荐
- 迷时师度,悟了自度(时间的边际效应),附VC参考书
12年前看过这篇文章,今天又看到了,还是有些感慨的.上课的时间虽然已经永远远去,用整块的时间去学习已经不可能,但道理还是要记着的,没准依然有用,自勉.------------------------- ...
- RxJava+Retrofit+MVP构建的App——聚合资讯
RtfRxMVP 聚合资讯APP,提供热点资讯,天气预报以及笑话精选服务,使用 Retrofit + RxJava + MVP 构建代码. Hello U 这是我的一个练习项目,第一次尝试运用 MVP ...
- 针对安卓java入门:运算符和表达式
逻辑运算符 &&和&判断是一样的,区别在于过程,&会把整个过程算一遍,&&一旦碰到false就不会往下
- 【原创】关于Adapter的The content of the adapter has changed问题分析
关于Adapter的The content of the adapter has changed问题分析 1.问题描述 07-28 17:22:02.162: E/AndroidRuntime(1 ...
- Python字符串的encode与decode研究心得 乱码问题解决方法
以下摘自:http://www.jb51.net/article/17560.htm 为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“\xe4\xb8\xad\xe6\x ...
- Oracle ->> 行转列, 列转行
除了Pivot和Unpivot这两个函数,还有像CASE WHEN + 聚合函数像MAX,SUM这类的来完成.今天发现Oracle下居然有这样一个和SQL SERVER 2012以后新增的新函数叫II ...
- Data Flow ->> Merge
Merge组件的作用和Union All很相似,就是把两个输入源的结果集合并成一个.但是不同之处在于: 1)Merge输入的结果集需要先经过排序(这点表示怀疑) 2)Merge对于输入的两个结果集的数 ...
- Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)
一.搭建Android开发环境 准备工作:下载Eclipse.JDK.Android SDK.ADT插件 下载地址:Eclipse:http://www.eclipse.org/downloads/ ...
- [android警告] AndroidManifest.xml警告 Should explicitly set android:allowBackup to true or false
http://www.cnblogs.com/javadu/p/3812528.html Android中AndroidManifest.xml警告 Should explicitly set and ...
- PHP中对数据库操作的封装
在动态网面设计中很多都要涉及到对数据库的操作,但是有时跟据需要而改用其它后台数据库,就需要大量修改程序.这是一件枯燥.费时而且容易出错的功作.其实我们可以用PHP中的类来实现对数据库操作的封装,从而使 ...