约瑟夫环问题

题目如下

上图可能有点歧义,大概意思是说,好人和坏人都有k个,好人站一起,坏人站一起,然后围成一个圈。从第一个好人开始数数,数到m停下,求m最小为多少才能使得坏人全被杀死而好人一个都不被杀死。

我们先设计主函数

由于原题k最大为13,因此我设置数组有26个位置,二维数组(一维也是一样的,因为只放了一个数),内部放上好坏类型,好人为1,坏人为0.然后输入k

第一个好人到最后一个好人的位置是0到k-1,第一个坏人到最后一个坏人的位置是k到2k-1.

然后我们进入循坏,判断从1开始(其实应该是从2开始,因为1肯定不成立,第一个报数的人是好人),哪个m满足条件那么就退出循坏,否则初始化数组,循环继续直到找到成立的m,第一个找到的即为最小的。

定义decide函数用于判断m是否满足条件。sum是活着的人数,bad是坏人的个数。进入循环,当坏人全部活着时循坏持续进行。退出循坏有两种可能,一种是坏人死光了退出循坏直接输出1,另一种是有好人死了,直接返回0,(由于是自定义函数,因此有返回值就不再运行)。这段函数的核心是找到报到最后一个数的人的位置。

找到报数的人很简单,使用%即可,(i+m-1)%sum即是报到最后一个数的人的位置。这样理解:i+m-1就是第i个人报1时,报到m的人的位置(此时有可能报到m的人的位置超越最后一个人的位置)。然后%sum,那么报数的人就一直在第一个人的位置0到最后一个人的位置sum之间循环,从第一个人报到最后一个人之后,下一个报数的人又回到了第一个人。

确定了报到m的人的位置之后,判断那人的类型。如果是好人,那么由于好人被杀,条件不成立,返回0。如果是坏人,那么坏人总人数-1,然后好坏人的总人数都-1。

OK,这道题就这么解决了,一个自定义函数即可,随缘更新,大家下次见

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值