强盗分金币

        有5个强盗(A、B、C、D、E)抢了100个金币准备分。对于怎么分这些金币,他们设定了一个规则:从A开始给出分金币的提议,然后所有活着的强盗投赞同或反对票,如果反对票数大于或等于赞同票数,A就被杀掉,否则就按此提议分金币;如果A被杀了,接着就轮到B提议,然后同样按上述规则继续下去。
  假设每一个强盗都是绝对理性的,也就是说他们都是绝顶聪明的(可以考虑到任何情况),而且他们的所有行为(提议与投票)都是对自己最有利的(即能够在保命的前提下得最多的钱)。

  请问,如果你是最先分金币的A,怎么样分才能即保住自己的性命,又得到最多的金币?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
11075 强盗赃 时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: 无限制 Description 有天夜里5个强盗A、B、C、D、E抢到一大堆金币金币个数不超过n个,n<=100000000),可是怎么也无法平均成5份,吵吵嚷嚷…… 吵累了,只好先睡觉,准备第二天再。 夜深了,一个强盗A偷偷爬起来,先拿了一个金币私下放自己口袋藏好,再将金币为5等份,将自己的那一份再私藏好就去睡觉了。 随着第二个强盗B也爬起来,也是私拿了一个金币5等份,也私藏起自己那份就睡觉去了。 后来的三个强盗C、D、E也都是这样办的。 问最初有多少个金币?(最初的金币个数有多种可能,请输出n以内所有可能,从小到大排列) Input 输入一个数,n。 请输出金币数不超过n的可能的初始金币个数。Output 初始金币个数的多种可能(初始金币个数小于等于n)。 请输出不超过n的“所有的”可能,从小到大排列出,中间空格相连。 如果不超过n没有一种可能,输出impossible(无标点,无大写) 例如输入10,则输出impossible Sample Input 8000 Sample Output 3121 6246 Hint 此题所说的是:每个强盗私拿1个金币后都可以五等,再私藏起1份,留下4份。 这样的初始金币个数是怎样的数,才能满足这个条件。 方法一: 此题若仅采用程序实现的话是较为简单的,可使用递归算法,或循环处理。递归算法如下(循环处理也很简单): int count = 0; int func(int num) //判断初始为num的数是否合适 { int temp = num-1; if(temp%5 == 0 && count<5) { count++; return func(temp/5*4); } else if (count==5) return 1; else return 0; } 但若要析初始金币个数的通项函数表达就更难一些: 方法二: 从最后一个强盗往前考虑,假设到第五个强盗E时,平均每个强盗得到x个金币 第五个强盗E藏掉一个金币后剩5x个 第四个强盗D藏掉一个金币后剩5(5x+1)/4=25x/4+5/4 第三个强盗C藏掉一个金币后剩5(25x/4+5/4+1)/4=125x/16+45/16 第二个强盗B藏掉一个金币后剩5(125x/16+45/16+1)/4=625x/64+305/64 第一个强盗A藏掉一个金币后剩5(625x/64+305/64+1)/4=3125x/256+1845/256 原来共有金币3125x/256+1845/256+1=3125x/256+2101/256=(12x+8)+53(x+1)/256 这里是突破口:53(x+1)/256 是整数,因金币数是整数,所以x=255时最小的初始金币总数3121个。 方法三:或者这样析,设金币总数n,由于5个强盗都是先藏一个后,发现余下的金币刚好均5份, 所以设想在总数中加入4个新金币,则每个强盗占有的金币数不会改变(包括藏了的那一个), 从而每次金币时这4个假想的金币会留存到后一层总数中,这使得每次5份都是恰好的整数, 由此可见,n+4至少是5^5的整数倍,所以n的最小值为5^5-4=3121。 其余可能的n值为n=k*(5^5)+4,k为大于1的整数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值