Joseph问题和POJ1022&POJ2244

常见的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

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值