囚犯问题

邪恶而心思缜密的典狱长最近心血来潮,于是召集了100个囚犯。望着眼前的囚徒,他的嘴角弯起了一个得意的弧度:

“宣布一个好消息,大家有机会获释了。”

“我们一起做个轻松愉快游戏,赢的人可以立即走出这里。"

"说下游戏规则吧。游戏开始后,我会把你们随机排成一列。然后给每个人背上贴一张纸条,黑色或者白色。规矩是,后面的人能看到前面人的颜色,但是前面的人不能回头看后面的人,更不能看自己的纸条。一旦发现违规,——全部处死。游戏开始以后,每个人从后往前依次报出自己的颜色。当让了,前面的人能听到后面的人说了什么。如果说对了,给你自由;说错的话,处死!”

底下人潮涌动。

欣赏着各色表情,狱长先生继续说:"呵呵,刚才与诸位开个玩笑。只不过,猜错的某位,要劳烦在这里多待一个寒暑罢了。”

随即,目光下沉:“但要记住,只能报‘黑’或‘白’。多说一个字,立即处死。"

“明早,这里集合;9点钟,游戏开始。先生们,能获得多少自由,就看你们自己的了,不要让我失望哦。”

那么问题来了,这群囚犯应该商量一个什么样的对策,才能让自己获释的机会最大呢?

如果每个人随机回答自己的颜色,所有的人只有五成的机会。

如果后面的人报出前面一个人的颜色作为提示。前面一个人可以确保自由,后面的人仍然只有一半的机会。总体上有75%的机会。

是否还有更好的方法呢?

这个方法是存在的,而且好到可以让前面的99个人自由,后面的一个人有一半的机会自由,总体上达到99.5%的成功率。

那么这个策略是什么样的呢?

看下已知量是什么:

1)每个人可以看到前面的人,也可以听到后面的人。如果后面的人报的颜色是正确的话(最后一个人除外),他可以知道:除了他以外,其他人的帽子颜色。

2)游戏开始以后,所有人的帽子颜色值是一定的。这是一个不变量。

黑色用1表示,白色用0表示。

最后一个人可以看到前面99个人有多少个1(黑色)。如果是奇数个,他就报1(黑色),如果是偶数个,就报0(白色)。

前面的听到最后一个人的暗示以后,就知道自己这99个人当中黑白的奇偶j;当然他也知道其他人帽子颜色。所以就可以推测出自己的颜色。

举个例子:

6个人从前往后帽子颜色是:

0 1 0 1 1
0

最后一个人看到有3个1,于是就报1,发出暗示。当然他也就牺牲小我,成就大我。

第5个人看到前面有2个1,于是知道自己也是1,就报1(黑色)。

第4个人听到第5个人是黑色,也看到前面3个人有1个黑色,加起来是2个黑色,所以自己必然是黑色。

第3个人可以知道前5个人中,除了自己有3个黑色,于是知道自己是白色

依次类推,前5个人都可以准确猜出自己的颜色。

如果是100个人,依此进行。

把这个问题进行抽象,我们实际上要对前99个值做一个运算,得到的值{0,1}作为最后一个人的暗号

这个运算函数是F, F(B1, B2, ...,B99)的值就是B100

最后每个人i可以通过B100,以及{Bk, k不等于i}这个集合,做F的逆运算,然后得到自己的值。

我们的目标就是找到这个函数F

最后我们找到的这个函数F就是:计算集合{Bi, 1<=i<=99}中1的奇偶性。奇数用1表示,偶数用0表示。

用计算机当中的位运算来说说,这是一个异或函数。

时间: 2024-11-05 12:31:51

囚犯问题的相关文章

囚犯枪决站位战略

Question:有N个囚犯编号分别为1~N,按顺序围成一个圈.从1号开始1.2.1.2…地轮流报数.数到2的囚犯将被枪决.最后只有一人能避过枪决活下来.求该囚犯的编号. # coding:utf-8 N = input() L0 = range(1,N+1) #定义编号列表 def start_1(L0): '''开始报数为“1”的一轮枪决''' L=[] #存活囚犯编号列表 for i in range(len(L0)): if i%2 == 0: L.append(L0[i]) retur

编程题-贿赂囚犯(Bribe the prisoners)-动态规划|剪枝

转载请注明出处:http://blog.csdn.net/Lizo_Is_Me/article/details/43735509 问题描述: 一个监狱里有P个并排着的牢房,从左往右一次编号为1,2,-,P.最初所有牢房里面都住着一个囚犯.现在要释放一些囚犯.如果释放某个牢房里的囚犯,必须要贿赂两边所有的囚犯一个金币,直到监狱的两端或者空牢房为止.现在要释放a1,a2,...,aQ号囚犯,如何选择释放的顺序,使得使用的金币最少. 思路: 其中很重要的一点:释放了某个囚犯以后,就把连续的牢房分成了没

法国上演真人版《越狱》,囚犯乘直升机逃跑

今日导读 美剧<越狱>里有一句经典台词:"有时事情的发生是你无法掌控的." 这句话,对于最近为一起越狱事件感到焦头烂额的法国警察们来说,再也适用不过了.就在前阵子,法国上演了一出堪称"好莱坞动作大片"的越狱大戏,里面的主人公和<越狱>的男主角相比,简直"有过之而无不及". 带着问题听讲解 Q1: 文中用了哪几种方式表示"越狱"? Q2: 请用自己的话描述一下 Fa?d 这次越狱的过程. Q3: &quo

【区间DP】释放囚犯

貌似和石子合并差不多 可能是我见的题太少了,所以都差不多 OK 算法分析 首先不难看出这是一道区间DP,那么,按照本蒟蒻的意思 区间DP==三个循环 for(int len=2;len<=n;len++) >for(int l=1;l+len-1<=n;l++) { int r=l+len-1; for(int k=l;k<=r;k++) 状态转移方程: } 接下来就是推方程的事情了 设f[i][j]为释放掉i~j号囚犯的最小花费,那么,容易得出 f[l][r]=min(f[l][

P1622释放囚犯

这是一道绿题,是一道让人想用贪心但却是区间DP的题目,难倒了我这个蒟蒻. 这个题其实仔细观察是类似于石子合并的!合并石子的代价便是肉的数量,求最小代价.所以我们设dp[i][j]为释放第i个到第j个所花费的代价,先用sum[i]求出每一个节点(犯人1与起点间的人数,犯人i+1与犯人i间的人数,终点与犯人q间的人数,也就是前缀和(还要-1)然后进行区间DP.首先枚举区间的长度,嵌套枚举区间的起点,那么区间的终点便可以得到,然后令dp[i][j]=0xfffffff后枚举分割点,看先释放哪个囚犯更好

洛谷P1622 释放囚犯

题目描述 Caima王国中有一个奇怪的监狱,这个监狱一共有P个牢房,这些牢房一字排开,第i个紧挨着第i+1个(最后一个除外).现在正好牢房是满的. 上级下发了一个释放名单,要求每天释放名单上的一个人.这可把看守们吓得不轻,因为看守们知道,现在牢房中的P个人,可以相互之间传话.如果某个人离开了,那么原来和这个人能说上话的人,都会很气愤,导致他们那天会一直大吼大叫,搞得看守很头疼.如果给这些要发火的人吃上肉,他们就会安静点. 输入输出格式 输入格式: 第一行两个数P和Q,Q表示释放名单上的人数: 第

算法系列:约瑟夫斯问题

约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环. 有{\displaystyle n}个囚犯站成一个圆圈,准备处决.首先从一个人开始,越过{\displaystyle k-2}个人(因为第一个人已经被越过),并杀掉第k个人.接着,再越过{\displaystyle k-1}个人,并杀掉第k个人.这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着. 问题是,给定了{\displaystyle n}和{

问题 A: 【高精度】被限制的加法

问题 A: [高精度]被限制的加法 时间限制: 1 Sec  内存限制: 16 MB提交: 56  解决: 30[提交][状态][讨论版] 题目描述 据关押修罗王和邪狼监狱的典狱长吹嘘,该监狱自一千年前建成以来,尚未有一个囚犯能够成功地越狱.当然这应该要归功于对囚犯们严格的信息管制,例如囚犯们虽然可以自由地使用计算机,但计算机的内存被密码锁设置为仅有100KB大小,显然,在这小得可怜的内存上想编程进行任何大规模的魔法运算,几乎是不可能完成的任务.但修罗王信奉的格言是“一切皆有可能!”,为了破解掉

人工智能第一次作业

1. 你认为什么是人工智能? 它是研究.开发用于模拟.延伸和扩展人的智能的理论.方法.技术及应用系统的一门新的技术科学. 人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人.语音识别.图像识别.自然语言描述和专家系统等.人工智能是对人的意识.思维的信息过程的模拟.人工智能不是人的智能,但能像人那样思考.也可能超过人的智能. 2. 简述推理.学习.存储,三者之间的联系! 首先,我们先看一下推理.学习.存储在人工智能