今天看了一篇博客,说的是导论的一道课后题以及博主的解答,感觉对逻辑思维的锻炼还是很有价值的,特意引用一下。这个题目的题意是这样的:

  有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)
第一问,坏人可以采取如下策略,碰到好人就说坏人,碰到坏人就说好人。这样坏人要么和好人一块被淘汰掉,要么混淆两个好人,没有确定的方法可以确保我能找到好人,只能看运气。

转载于:https://www.cnblogs.com/xuekai-to-sharp/p/3341377.html

一道有意思的导论问题相关推荐

  1. 一道有意思的css面试题,9宫格

    今天出去面试,遇到了一道有意思的面试题:写一个css9宫格,要求边框是5px,鼠标hover的时候边框变色. 当时没有答出来,回来想了两个写法感觉都不是最优解. 1.html部分 <ul> ...

  2. 一道有意思的概率应用题

    一道有意思的概率应用题 @(概率论) 在长为L的线段上任取两点,求两点距离的期望和方差. 分析:这其实是具体化的均匀分布.即在线段上任取点,取的任何一点X的概率是: fX(x)=1Lf_X(x) = ...

  3. 一道有意思并对你有帮助的Promise题

    一道有意思的题 以下我的学习分析心路历程,以及我自己又多加了几道菜:希望对你有帮助 先上菜 new Promise((resolve, reject) => {console.log('prom ...

  4. 一道有意思的js面试题

    给大家分享一道比较有意思的js面试题 function Foo() {getName = function () { console.log (1); };console.log(this)retur ...

  5. 自动驾驶算法岗笔试题 | 一道有意思的数学题 | 解析及代码实现

    文章目录 参考资料 1. 题目描述 2. 问题分析 1. 问题 1 分析 python代码实现 2. 问题 2-1 3. 问题 2-2 参考资料 https://max.book118.com/htm ...

  6. 一道有意思的阶乘计算题

    文章目录 1 题目描述 2 分析 2.1 基本做法 1 题目描述 输入n, 计算 下面公式的末六位(不含前导0).n<=10^6,n!表示前n个正整数之积 S=1!+2!+3!+4!+5!+.. ...

  7. 一道有意思的找规律题目 --- CodeForces - 964A

    题目连接: https://vjudge.net/problem/1502082/origin 这一题第一眼看过去貌似是模拟,但是根据其范围是1e9可以知道,如果暴力解基本上是不可能的(不排除大佬级优 ...

  8. 一道有意思的数据库题

    create table stu (id char(20) PRIMARY key,score int,cno char(20) not null ); 问:选项中哪几个结果一样? A select ...

  9. 一道有意思的数学题(11223344)

    有11223344 8个数字,要求两个1之间有1个数字,两个2之间有两个数字,两个3之间有三个数字,两个4之间有四个数字,求这个8位数是几?

最新文章

  1. java项目包创建顺序_java程序初始化的顺序
  2. 随机森林与梯度提升树
  3. springboot需要tomcat服务器吗_SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理...
  4. 从零开始学前端:表单制作 --- 今天你学习了吗?(CSS:Day05)
  5. 思考题1(雇员、部门、领导)
  6. div设置背景半透明
  7. WebRtc搭建 coturn
  8. 终端下svn常用命令介绍
  9. lock.lock()使用,与synchronized对比
  10. 《微表情心理学》总结
  11. java练习案例_Java版打字练习案例源码
  12. DOM事件+正则表达式
  13. 一次由于SQL Server BUG引起的数据库AlwaysOn主从切换故障分析处理
  14. 自定义通用信号处理核心板CMB-2C6657-1K7
  15. 微信会员卡,信息类目字段跳转小程序【custom_field1】【巨巨巨巨坑】
  16. 《迷途深渊》隐私声明
  17. 自动化一切!那些我每天使用的快捷自动化工作
  18. Android 屏幕适配扫盲、教程
  19. 一文搞懂G1垃圾回收器
  20. win10删除设备和驱动器中多余的软件图标

热门文章

  1. 网络知识:内网、外网、宽带、带宽、流量、网速之间的联系?
  2. 程序人生:提高代码运行效率的9个技巧
  3. Web网络知识:什么是HTTP请求合并?
  4. 硬件编程:硬件开发中常用的几种通信接口总结
  5. 7个HTML你可能不知道的使用技巧
  6. 盘点计算机世界那些经典谣言
  7. 使用ESCAPE定义转义符
  8. gsettings命令使用简介
  9. 图书漂流系统的设计和研究_研究在设计系统中的作用
  10. 手写一个合格的前端脚手架