常见的Joseph问题(又叫约瑟夫问题),一般又如下两类(其中初始队列长为n,跳数为m):
1、求最终的存活者序号,此类问题可采用递归法解决,解法可见ACM牛人 http://www.cppblog.com/AClayton/archive/2007/11/06/35964.html
2、求使得某特定序列不被轮到的最小m值,这类问题的经典代表是POJ1012,解法的核心是p = (p + m - 1) % rest + 1,其中,右边的p为当前被轮到的元素在当前所剩序列中的序列号,m为跳数,rest为当前序列所剩元素的个数,整个整式所得为下一次循环中将要被轮到元素在去掉当前轮到元素所剩序列中的序列号(貌似有点拗口,哈哈!)。这个思想是参考这个blog后得到的:http://konglingbao2010.blog.163.com/blog/static/1369606982010360201266/
我poj1022的代码如下:
Memory: 144KTime: 235MS
Language: CResult: Accepted
同样的POJ2244可以采用与1012相同的思路,唯一的区别在于初始队列的长度为n-1,并且判断m是否符合的条件稍微做了改变(由原先的==k变成了==1),2244代码如下:
Memory: 100KTime: 16MS
Language: CResult: Accepted