推广的海盗分金币问题的算法

在杨军blog上看见一个海盗分金币问题,很有趣,准备在这里推广并用计算机可操作的算法实现。原题的描述以及解题思路杨军已经给出了,详见hi.baidu.com/yjpro/blog/category/%D6%C7%C1%A6%D1%B5%C1%B7。

推广:
n个海盗,m个金币。其中n >= 2,m >= 1。
基本思想:
杨军已经给出,关键就是“倒着想”,并假设每个海盗都很理智。每个海盗都有一个金币数量的收入的期望,如果他必死,那么他的收入期望是-1。如果第k个海盗来制定分配方案(因为是倒着想,所以不考虑前k-1个海盗),那么他需要贿赂他后面n-k个海盗中不少于一半的海盗,使得他们给自己投赞成票。为了使自己的收入最多,他贿赂的方式就是从期望收入最少的海盗开始,在他原来的期望收入基础上再加1个金币,直到贿赂了足够多的海盗。这样描述不准确,但是大体思想说出来了。
算法:
利用数学归纳法。初始化时,将海盗顺序标号为1~n。将第n个海盗的期望收入置为m,第n-1个海盗的期望收入置为-1。假设后k个海盗的收入期望已经算出来,那么倒数第k+1个海盗的收入期望这样计算:将后k个海盗按收入期望升序排序,选择前(k+1)/2个期望,每个期望加1,用m减去这些期望的和,得出的就是倒数第k+1个海盗的收入期望。如果该期望小于0(证明总金币量不够他贿赂足够的人,他将死去,因为我们假设海盗是一群糙人,他们不愿意看见决策者没有给自己比期望更多的贿赂:)&#x

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值