约瑟夫 (Joseph) -- ACM PKU 1012 解题报告

该博客详细介绍了如何解决ACM PKU 1012问题,即在约瑟夫问题的基础上,确定最小的m值,使得k个坏人全部在k个好人之前被处决。博主提出了一种算法,通过模拟从m=k+1开始的每一轮执行过程,更新存活人数和起始位置,直至找到符合条件的m值。算法的关键在于好人的编号始终保持不变,而无需关注坏人的编号变化。此外,博主还提及了原问题的动态规划解法和特殊情况下的解析解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:The Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, . . ., n, standing in circle every mth is going to be executed and only the life of the last remaining person will be saved. Joseph was smart enough to choose the position of the last remaining person, thus saving his life to give us the message about the incident. For example when n = 6 and m = 5 then the people will be executed in the order 5, 4, 6, 2, 3 and 1 will be saved.
Suppose that there are k good guys and k bad guys. In the circle the first k are good guys and the last k bad guys. You have to determine such minimal m that all the bad guys will be executed before the first good guy.

参见 http://acm.pku.edu.cn/JudgeOnline/problem?id=1012

我的总体思路是,对从每个 m=k+1, k+2, ... ,计算出前 k 个被杀的人,如果他们的编号都比 k 大,则表示所有所有坏人都被杀掉了,从而找到了最小的 m。

用 rest 表示还有多个人活着,初值为 2k。当 start 表示当前轮从哪个编号开始计算,初值为 1。用 killed 表示当前轮要被杀的人的编号。则 killed = (st

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值