面试遇到的智力题,与大家分享,我只记得大意。

vectorsoftwareli 2012-12-28 09:09:00
有1000瓶液体,其中只有一瓶是有毒的,老鼠只要喝一点就会在24小时内死掉,请问,在24小时内,至少需要多少只老鼠才能找出这瓶有毒的瓶子?
...全文
471 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbaldy 2013-01-18
  • 打赏
  • 举报
回复
引用 18 楼 amoyman 的回复:
恍然大悟。 每只老鼠编号,代表(二进制)上的每一位。 1000瓶编号,对应二进制。位1就让那一位对应的老鼠喝,0不喝 最后看看死掉的老鼠对应位1,活着的0,就得到毒药编号。 果然巧妙
的确巧妙啊
阿麦 2013-01-18
  • 打赏
  • 举报
回复
恍然大悟。 每只老鼠编号,代表(二进制)上的每一位。 1000瓶编号,对应二进制。位1就让那一位对应的老鼠喝,0不喝 最后看看死掉的老鼠对应位1,活着的0,就得到毒药编号。 果然巧妙
swordtan 2013-01-18
  • 打赏
  • 举报
回复
引用:http://blog.csdn.net/baili35/article/details/5556043

有1000瓶水,其中一瓶有毒,这个毒呢小白鼠喝了后24小时内死亡.问题出来了最少用多少个小白鼠可以在24小时内找出那个瓶水有毒呢.

晚上睡不着不知道灵感突然来了,这个问题的模型就是用多少二进制位可以表示1000内的一个数字.回答这个模型就简单了,1000表示为二进制表示1111101000.最大的1000用10位就中了,那么检验这1000瓶水要10个小白鼠.

那么要怎么样检验呢.经过我在床上转来转去的思考,终于想到了一个方法.1000瓶水太多了,我们用8瓶水说明情况(要用3个小白鼠做实验哦).好像下面的图叫做平衡二叉树来的吧.名词忘记了,能用就中.



所有小白鼠只喝右分支的水(要是左的话水编号要从右到左增加). 也就是
鼠1喝水4,5,6,7的混合液体
鼠2喝水2,3,6,7的混合液体
鼠3喝水 1,3,5,7的混合液体

貌似水0没有老鼠喝,但愿一个白鼠都没有死就是你水0有毒了.

这样小白鼠死亡表示1,不死亡表示0。鼠1,鼠2,鼠3组成个三位二进制(人类好残忍啊)
000对应水0有毒
001对应水1有毒

111对应水7有毒
1000瓶水和这个原理一样用十个小白鼠就找到那瓶水有毒了.
swordtan 2013-01-18
  • 打赏
  • 举报
回复
老问题,这个讲的很清晰 http://blog.csdn.net/baili35/article/details/5556043
okmime 2013-01-17
  • 打赏
  • 举报
回复
1.24小时内死还是刚好第24小时的时候死?如果是后者,说明所有的老鼠只能死一次(废话)。说明老鼠基数的排列组合必须唯一标识出毒药的位置。 2.如果是24小时内某时刻死,老鼠死了也不能复活,10只老鼠能表示出1024种情况,老鼠死了复活不能继续去吃药来表现以后的情况。唯一不同的是没死的老鼠可以继续当成新老鼠来复用,减小老鼠的基数。 解答方案: 如果是第一种情况,这个题目没有什么实际意义,不断循环二分法推断,直到找到那个毒药瓶,需要N个老鼠,有兴趣自己去算。 第二种情况便是没死的老鼠可以继续作为下一轮测试的基数老鼠,例如第一次1000个毒瓶分为各500,老鼠1和老鼠2去试验各500个,结果老鼠1死了,老鼠2可以作为下一轮试验250,250的其中一个老鼠。 且老鼠死亡还必须有一些时间限制。 下面是一点代码,运行结果是10只。

#include "stdafx.h"

void fun();
int max = 1000;
static int count = 1;

int _tmain(int argc, _TCHAR* argv[])
{
	fun();
	printf("count : %i\n",count);
	return 0;
}

void fun()
{
	if(max == 1)
		return;
	max /= 2;
	count++;
	return fun();
}
不知分析的对不对,这道题确实不太严谨
miliggate 2013-01-17
  • 打赏
  • 举报
回复
log(1000)
赵4老师 2013-01-17
  • 打赏
  • 举报
回复
9只老鼠+1个出题者
liangrf782533655 2013-01-17
  • 打赏
  • 举报
回复
引用 13 楼 w7822938 的回复:
楼主你看3楼的答案撒。10只老鼠死/没死。信息量10bit 可以表示2^10=1024种情况。
恩,答案就是这10只
torytin 2012-12-30
  • 打赏
  • 举报
回复
楼上的都没注意题目条件,在24小时内,至少需要多少只老鼠才能找出这瓶有毒的瓶子? 而老鼠毒性发作是刚好需要24小时的,所以这个题必须保证老鼠第一时间就喝下有毒的药水,而且你要能判断的出来老鼠是因为喝了哪瓶才死的,因此应该是20只,前10只用二分的方法判断前500瓶,后10只判断后500瓶
w7822938 2012-12-30
  • 打赏
  • 举报
回复
楼主你看3楼的答案撒。10只老鼠死/没死。信息量10bit 可以表示2^10=1024种情况。
bigwangdi 2012-12-30
  • 打赏
  • 举报
回复
2^10 = 1024的原理,10只足矣,根据二进制。是个很老的题目了。
SKATE11 2012-12-30
  • 打赏
  • 举报
回复
陈年老题了 2的10次方1024 取10就行了
vectorsoftwareli 2012-12-29
  • 打赏
  • 举报
回复
问题时,只有24小时,如果按二分法这样做,找出有毒瓶子就超过24小时了啊?
Binzo 2012-12-28
  • 打赏
  • 举报
回复
二进制编码什么的。
madbunny 2012-12-28
  • 打赏
  • 举报
回复
这个不就是二分法么。 将所有瓶子分成相等的两份,然后混合出两份,喂老鼠一份。没死,有毒的瓶子在另一半瓶子里,死了有毒的瓶子就在这一半。然后再把有毒的一半瓶子分两份,不断循环,直到只有两个瓶子。
prajna 2012-12-28
  • 打赏
  • 举报
回复
引用 2 楼 lishancai 的回复:
如何做实现?
這個要費些腦細胞
prajna 2012-12-28
  • 打赏
  • 举报
回复
引用 1 楼 mmhaojie 的回复:
10只就OK,
++
MuyouSome 2012-12-28
  • 打赏
  • 举报
回复
liuwons 2012-12-28
  • 打赏
  • 举报
回复
就是个1000个数用多少位二进制编码 和汉明码类似 1000个瓶子各按编号编码,每个老鼠表示一位bit,所有老鼠都喝下相应bit位为1的编号的液体。 所有老鼠的bit位指示出有药的液体(死掉的老鼠相应bit位为1,没死的为0)
vectorsoftwareli 2012-12-28
  • 打赏
  • 举报
回复
如何做实现?
加载更多回复(1)

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧