(算法)海盗分赃_2

分享一篇趣文(来自伯乐在线:http://blog.jobbole.com/70395/),同样是海盗分赃问题,这篇文章以诙谐幽默的口吻以及浅显易懂的对话来解释海盗分赃问题。

与上一篇博文海盗分赃_1不同的是,这里的投票规则为半数即可,并不要求大于半数。因此该问题的思路过程结果为:

        (300,0)

      (299,0,1)

    (299,0,1,0)

  (298,0,1,0,1)

(298,0,1,0,1,0)

文章如下:

#算法题# 6个海盗要分赃300金币。规则是由资格最老的海盗提出各人分到的数量,然后全体投票。如方案得到至少半数同意票,则按该方案执行,否则提出方案的海盗被杀死,再由剩下人中资格最老的继续提出方案。海盗都很聪明,在能生存的前提下会追求获利最大化。问最后分赃结果是怎样的?

这个题挺有意思的,主要测试的是一种简化问题的思维能力,类似于中学数学里的证明题,先看n=0是否成立,然后假设n-1成立,证明n也成立。

  如果从6个人的角度来看确实无从下手,看起来似乎每个人都有投反对票把资格最老的海盗弄死然后自己多分点的倾向,但是每个人能分到多少又想不明白。

  因为变化实在太多了,那就先假设海盗们乱投了一气,杀死了四个海盗,最后只剩下了两个人吧。

  这下轮到老五提出方案了。他一看就剩俩人,那咱自己一票就是50%,不用管老六是否赞成,太好了!于是根据生存&&获利最大化原则,他把300个金币都分给了自己,老六啥也没得到,而且一投票就通过了,他一点办法也没有。

  所以,当n=2的时候,本算法题得到了第一个确定而且稳定的结果:(300,0)。下面可以倒推n=3,4,5,6的情况。

  看到这个结果,老六傻眼了。合着自己搀和了半天啥也没有啊,而且还害死了前面对自己挺好的几个前辈,太亏了! 于是老六对上帝祈祷:“上帝啊,如果再给我一次重来的机会,我一定会对老四说:我投你,如果非要给这句话加上一个期限,我希望是一万年!”

  话说也巧了,上帝正好从旁边路过,听到如此熟悉而虔诚的祷告,不禁心生恻隐,于是现身对他们说:“好吧,既然你背了我的好基友孙悟空的台词,那我就满足你的这个请求。”

  老五一看不干了:“Ooooooh Nooooooo!上帝啊,你可不能偏心!”

  可是上帝必须是有身份证的体面人,是要讲信誉讲诚信的。所以一下子那四个死去的海盗又复活了,开始重新分配赃物。

  老六首先嘀咕着:“老五真不是东西,剩下俩人就欺负我。这次只要老四给我一个金币,我就投赞成票!反正无论如何也轮不到我来分,到老五这儿就game over了…”

  老五一听急了:“要是这样,老四可以一个大子都不给我就以2:1的票数通过了,不干!如果老三给我一个金币,我就赞成老三,我们俩50%赞成票,让老四老六都喝西北风去!”

  老四奸笑着说:“ 别闹了,你们俩想黑我,没门。这回我知道有老三在前面,加上老五和他狼狈为奸,肯定轮不到我来分。这样吧,老二给我一个金币就行了,再给老六一个,这样咱仨就通过了,嘿嘿,轮不到老三分配就结束!”

  老三怒了:“老大还活着呢!老二算神马东西!让老大分!老大给俺和老五各一个金币,我们哥俩就支持你,3票就够了,其他人反对也没用!”

  老大嘿嘿一笑:“真的?你娃上回把老子给害死了,这次老子能信你?”

老三哭着说:“老大你大人不记小人过,上回我不是也被他们害死了么?这次我要不支持你我就是个锤子,你想啊,老二分的话我啥都拿不到,你老给我一个金币我已经感激不尽了!”

  老五也赶紧表忠心:“老大你就这么定吧,我们要是投了反对票就轮到老二分了,按照老四老六的意思,我和老三都得喝西北风啊!上帝在旁边见证,要是我们俩言而无信,出门就被车撞死!”

  上帝不屑地哼了一声:“我在这里还要什么车撞,我拿块豆腐都能砸死你们信不?”

  老三老五吓得连连点头:“我信,我信!”

  老二老四老六一看形势危急,纷纷嚷嚷起来:“老大,这俩小子不能信啊!”

  老大看了看他们:“不信他们难道信你们?最不可信的就是老二,他就盼着我死好拿大头呢,以为我傻啊?哼哼。”

  老二无话可说,郁闷地蹲到一边抽烟去了。老四老六还不甘心:“老大,害死你老二肯定是最赚的,所以他肯定投反对票。可我们也没多大盼头不是?最多也就得一个金币。您老别给老三老五金币,给俺们,俺们投你也是一样的两票嘛!”

  老大想了想说:“不行。如果老子死了老二来分,你们也能得一个金币,所以老子要给你们一个金币对你们来说没区别,除非老子给你们俩金币才能保证你们不反水。可这样不如给老三老五各一个金币划算。嘿嘿,你们别忽悠老子,老子死了一回现在学乖了!”

  上帝越听越糊涂,有点不耐烦地打断了他们:“你们说的都什么玩意?玩逻辑是不?欺负俺们文科生呗?赶紧的,1000年前我约好了和孙悟空一起去塔图因星踢球,还有十几万光年的山路要赶,没工夫听你们在这儿扯淡。”

  老大一看大局已定,于是庄严地咳嗽一声,说道:“那老子就提了。老二老四老六得0个,老三老五得1个,老子拿298个。”

  老二老四老六自然不干,都投了反对票。老三老五投了赞成票,加上老大自己一票,正好50%赞同,于是六个海盗分完赃物,心情各异地走了。

  只有上帝呆在了原地,这个结果还真是出乎他的意料啊!又过了100年他终于琢磨明白了,自言自语地说:“算法这门学问还真是博大精深!应该好好学学!”

  于是上帝拿出手机,上网买了本原版的《算法设计手册》 ,然后给孙悟空打电话:“喂老孙不好意思,我有事不去踢球了。啥事?那啥,我得回去学算法….”

时间: 2024-10-01 04:04:35

(算法)海盗分赃_2的相关文章

【博弈】海盗分赃

题目大意:有N(N<=1000)个贪婪的海盗,他们得到了100,000个金币,决定分赃.他们都很精明,都想自己利益最大化,并采取如下策略: 1. 首先N人排好次序. 2. 由编号最大者给出分赃方案. 3. 所有人表决,50%及以上的人赞成就分赃成功,否则转4. 4. 杀掉提案者(总人数少了1),转2. 你的任务:判断第几号海盗得最多金币,有多少个. 题解:此题需要绕一个小弯,首先,获得钱最多的一定是第一个人.其次,他只需给所有奇数号的人一枚金币.可以YY一下,奇数永远都受偶数的限制,他们非常可能

(算法)海盗分赃_1

题目: P个海盗偷了D颗钻石后来到公海分赃,一致同意如下分赃策略: 首先,P个海盗通过抽签决定1-P的序号.然后由第1号海盗提出一个分配方案(方案应给出每个海盗分得的具体数量),如果能够得到包括1号在内的绝对多数(即大于半数)同意,则按照该分配方案执行,否则1号将被投入大海喂鲨鱼:而后依次类似地由第2号.第3号等等海盗提出方案,直到能够获得绝对多数同意的方案出现为止,或者只剩下最后一位海盗,其独占所有钻石.请编写一个程序,给出第1号海盗的钻石分配方案中自己分得的钻石数量. 附带的三个假定: 1)

2-10. 海盗分赃(25) (ZJUPAT 数学)

题目链接:http://pat.zju.edu.cn/contests/ds/2-10 P个海盗偷了D颗钻石后来到公海分赃,一致同意如下分赃策略: 首先,P个海盗通过抽签决定1-P的序号.然后由第1号海盗提出一个分配方案(方案应给出每个海盗分得的具体数量),如果能够得到包括1号在内的绝对多数(即大于半数)同意,则按照该分配方案执行,否则1号将被投入大海喂鲨鱼:而后依次类似地由第2号.第3号等等海盗提出方案,直到能够获得绝对多数同意的方案出现为止,或者只剩下最后一位海盗,其独占所有钻石.请编写一个

进阶实验2-3.1 海盗分赃 (25分)

P 个海盗偷了 D 颗钻石后来到公海分赃,一致同意如下分赃策略: 首先,P 个海盗通过抽签决定 1 - P 的序号.然后由第 1 号海盗提出一个分配方案(方案应给出每个海盗分得的具体数量),如果能够得到包括 1 号在内的绝对多数(即大于半数)同意,则按照该分配方案执行,否则 1 号将被投入大海喂鲨鱼:而后依次类似地由第 2 号.第 3 号等等海盗提出方案,直到能够获得绝对多数同意的方案出现为止,或者只剩下最后一位海盗,其独占所有钻石.请编写一个程序,给出第 1 号海盗的钻石分配方案中自己分得的钻

bnu24252 海盗分赃

题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=24252 这是四川2012年省赛的一道题,背景:海盗分宝藏.大概题意:给你N种价值的物品,物品有两个属性,一个是数量,一个是价值(价值是以2的ai次方表示的).为了公平起见,求出宝藏分配的最小差(二进制表示). 思路:当我们把宝藏合成后,即2*2^(n-1)宝藏=1*2^n宝藏(即二进制的进位处理),如果价值最大的宝藏可一分为二,那么该宝藏不会影响最终的结果(即该部分差值为0),如果价值最大的宝

【小米oj】 海盗分赃

背包 #define mm(a) memset(a,0,sizeof(a)); #define max(x,y) (x)>(y)?(x):(y) #define min(x,y) (x)<(y)?(x):(y) #define Fopen freopen("1.in","r",stdin); freopen("m.out","w",stdout); #define rep(i,a,b) for(int i=(a);

算法浅谈——递归算法与海盗分金问题

本文始发于个人公众号:TechFlow 最近看到一道很有意思的问题,分享给大家. 还是老规矩,在我们聊算法问题之前,先来看一个故事. 传说中,有5个海盗组成了一支无敌的海盗舰队,他们在最后一次的寻宝当中找寻到了100枚价值连城的金币.于是,很自然的,这群海盗面临分赃的问题.为了防止海盗内讧,残忍的海盗们制定了一个奇怪的规则: 他们决定按照功劳大小对五个人进行编号,由编号小的海盗先提出分配方案.如果方案能够得到大多数人的同意,那么就按照他提出的方案进行分配.如果不能通过,说明他已经失去了威望,海盗

排序算法大集锦_二路归并排序_2&3(分治思想)

第一段代码和合并排序差不多,用它来和第二段代码--二路归并排序作对比. 这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h> #include <limits.h> #include <malloc.h> void merge(int *m, int x, int y, int z) { int b1,b2,i,j,k; b1=y

模式匹配之surf----特征点检测学习_2(surf算法)

在上篇博客特征点检测学习_1(sift算法) 中简单介绍了经典的sift算法,sift算法比较稳定,检测到的特征点也比较多,其最大的确定是计算复杂度较高.后面有不少学者对其进行了改进,其中比较出名的就是本文要介绍的surf算法,surf的中文意思为快速鲁棒特征.本文不是专门介绍surf所有理论(最好的理论是作者的论文)的,只是对surf算法进行了下整理,方便以后查阅. 网上有些文章对surf做了介绍,比如: http://wuzizhang.blog.163.com/blog/static/78