【POJ1012】-约瑟夫问题

题目地址:http://poj.org/problem?id=1012

问题描述:约瑟夫问题是这样一个问题,N个人围成一个圆圈,分别给每个人编号1,2,3,……,N。第一轮从1号人物开始报数,报到第M个人时,第M个人自杀,并退出圆圈;接着从自杀的这个人往后一个人开始从1继续报数,报到M时,第M个人自杀;重复这一过程,直到只有最后一个人存活下来。

POJ1012中的这道题目对约瑟夫问题做了一些改动:

(1)限制了圈内的人数为2K,0<K<14

(2)认为前k个人为好人,后k个人为坏人,要求求得的M在杀死所有坏人前不准杀死一个好人。

基于以上理解,得到如下解题思路:

首先,针对第一轮,因为前k个人是好人,不能自杀,那么要求的M的值一定大于等于k;并且只需判断前k个自杀的人是不是都在后k个位置

其次,针对每一轮,假设当前自杀的人为die,当前轮的总人数为currLen,那么下一轮自杀的人肯定是(die+M-1)%currLen;

在对当前M进行判断时,只有当已经自杀的k个人不在前k个位置时,才是所求的M;否则,M加一,继续求解。

在我的VS下,测试两组数据,均得到正确结果。

提交代码时,却提示“Time Limit Exceeded”。仔细一看题目,原来有时间限制——Time Limit:1000MS

为了解决这个问题,不防先把计算出的k=1,2,3,……,13时的M值保存到数组中。

修改之后的代码为:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 复习一下关于约瑟夫环的实现原理: 如果用C来写的话,也会有许多的方法,比如1:采用链表(双向链表)2:递归3:队列...
    碧影江白阅读 2,218评论 0 3
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,776评论 0 33
  • 本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本...
    kyson老师阅读 1,509评论 0 49
  • 在一个复杂的,有状态的系统中,当一个对象的状态发生改变,如何通知系统,并对状态改变做出相应的行为是必需考虑的一个问...
    bigyuan阅读 491评论 0 3
  • 我,田冰,要改掉骨子里的惰性
    __blue__阅读 273评论 1 0