这个题目的题意是这样的:

有N个人,分为好人和坏人两种,每次你可以挑两个人出来让他们互相指识彼此是好还是坏。好人一定说实话,坏人会乱说。现在你要从他们里面找出一个肯定是好人的。一共有三问:(1)证明若好人数目不超过N/2,则坏人们总可以通过故意捣乱,让你找不出正确答案。(2)证明若好人数大于N/2,存在一种方法可以通过floor(N/2)次判断使问题规模缩小到最多只有原来的一半。(3)证明若好人数大于N/2,可以用theta(N)次判断找出一个好人。

这个题目我想了一天,终于算是想出来了,这个题目确实很巧妙,值的思考,我的证明如下:
记T=好人,F=坏人
那么两个人AB的指认结果可能为TT,TF,FT,FF。
TT对应的可能是A坏B坏,A好B好(两人都是坏人或者都是好人)
TF对应的可能是A坏B好,A坏B坏(A必然是坏人)
FT对应的可能是A好B坏,A坏B坏(B必然是坏人)
FF对应的可能是A坏B坏,A坏B好,A好B坏(一好一坏或者都坏)
先证明第二问,先假设N是偶数,一共是N/2对,让每对分别指认,如果结果是TT,那么两人或者都好或者都坏,随便留下一个人,如果结果是
TF或者FT,可以直接排除坏人剩下一个人,如果结果是FF,两人都不留下。这样经过这个过程后,剩下的人数<=N/2。
接下来证明这剩下的人中好人仍然比坏人多,由于FF两人都拿下,并且拿掉的坏人肯定>=好人,由于初始好人>坏人,所以除去FF对应的人里面好人还是比坏人多,假设回答TT的里面好人有n对,坏人m对,回答FT或TF的里面有好人的p对,都是坏人的z对,那么2n+p>2m+2z+p,得到n > m + z,按照前面的步骤淘汰后剩下的好人有n+p,坏人有m+z,因为n>m+z,所以n+p>m+z,好人比坏人多。
接下来看N是奇数的情况,同样按照上面的步骤比较,会剩下一个单独的人,假设我们剩下的是个好人,那么那n对中好人>=坏人,最后得到n+p>=m+z,再加上剩下的这个好人,n+p>m+z,好人比坏人多;如果我们剩下的是个坏人,那么n队中好人>坏人+1,依次计算下去,还是好人比坏人多。
第二问就此得到证明。
第三问的话就明显了,递归使用上述方法,N/2+N/4+N/8...=theta(N)
第一问,坏人可以采取如下策略,碰到好人就说坏人,碰到坏人就说好人。这样坏人要么和好人一块被淘汰掉,要么混淆两个好人,没有确定的方法可以确保我能找到好人,只能看运气。

算法导论的一道课后练习题,挺有意思相关推荐

  1. 算法导论第16章练习题 16.1-4

    16.1-4 假设有一组活动,我们需要将它们安排到一些教室,任意活动都可以在任意教室进行.我们希望使用最少的教室来完成活动.设计一个高效的贪心算法,求每个活动应该在哪个教室来进行. (这个问题也被称为 ...

  2. 算法导论习题,思考题题解博主录

    算法导论最好结合课后习题来看,以查漏补缺,检验自己对知识的掌握和理解水平 我在看的过程中,参考了以下博主的博客 http://blog.csdn.net/longhuihu?viewmode=cont ...

  3. 计算机网络导论课后答案,课后练习题参考答案 计算机网络导论.doc

    课后练习题参考答案 计算机网络导论 1. 人类的信息文明史分那几个阶段?它的发展有什么特点? 1)语言的产生:从简单的声音交换信息,到使用更复杂的语言来交换信息. 2)文字的产生:使用一些特定的符号来 ...

  4. 算法导论第2版-附录课后习题答案

    算法导论-附录A.1-3 对 0<∣x∣<10<|x|<10<∣x∣<1,证明 ∑k=0∞k2xk=x(1+x)/(1−x)3\displaystyle \sum_ ...

  5. 算法导论课后习题答案汇总

    刚开始看算法导论,平时时间也不是特别多花在这个上面,不过会一直写下去的,下面是传送门: 链接: 算法导论第三版2.1答案 算法导论第三版2.2答案 算法导论第三版2.3答案

  6. 《程序员面试金典》+《算法导论》

    <程序员面试金典>+<算法导论> 因为最近可能会面临一波面试,但是自己各种算法以及常见的问题的熟悉程度感觉还不够,但是由前几次的代码优化经验来看,算法优化可以说是代码优化的重中 ...

  7. 算法导论(c++实现)chapter4

    算法导论的第四章--分治策略,主要的算法为寻找最大子数组问题,还有矩阵乘法的Strassen算法,还有一些课后的练习题,主要讲了求解递归式的三种方法:代入法(感觉像是猜测,然后用数学归纳法验证),递归 ...

  8. 《算法导论》读书笔记--第三章 函数的增长

    好长时间了,继续算法导论. 当输入规模足够大时,并不计算精确的运行时间,倍增常量和低阶项被舍去.我们要研究的是算法的渐近效率,即在输入规模无限量时,在极限中,算法的运行时间如何随着输入规模的变大而增加 ...

  9. 《算法导论》读书笔记(七)

    <算法导论>读书笔记之第16章 贪心算法-活动选择问题 前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优 ...

最新文章

  1. 360浏览器兼容模式下IE内核版本
  2. 成功解决This DCH driver package is not compatible with the currently installed version of Windows. This
  3. java面试题十七 switch使用范围
  4. ECMAScript基础(三)-关键字
  5. 2c语言程序设计_大学生学C语言的理由是什么
  6. 万能套用PS分层模板,不怕老板捉急!
  7. ETL PostgreSQL in Oracle ODI 12c
  8. 利用声子色散曲线推导刚度矩阵
  9. 小程序解析富文本(支持视频,支持微信编辑器,支持135编辑器富文本样式)
  10. dp算法之平安果路径问题c++
  11. 这是最好的时光,这是最坏的时光 SNAPSHOT
  12. 生成随机数字字母组合参数
  13. go服务器验证苹果账号登录
  14. ubuntu右上角没有网的问题解决
  15. 教你如何用手机打特殊符号、日文、韩文、繁体字。::======
  16. BDC的执行模式与更新模式
  17. [Swift]UIButton文本添加下划线
  18. 洛谷P1095 守望者的逃离 (从未感觉DP如此清晰, 所以这是DP吗2333)
  19. PAT日志 1035
  20. 计算一班总分 使用的计算机公式是,班级学科均量值意义及计算方法简介

热门文章

  1. 清理电脑垃圾(windows)
  2. python 模拟微信浏览器请求_用chrome在电脑上模拟微信内置浏览器
  3. HDMI硬件设计要求及CTS要求
  4. 伪造链接地址的二种方法
  5. 简述什么是图灵机_图灵机简介和原理分析
  6. 史上最全的大厂机器学习面试题,赶紧收藏吧!(附详解答案)
  7. Python转盘游戏
  8. 模型、数据分布稳定性
  9. 自然数拆分Lunatic版
  10. 物联网无线通信模块的新选择