秋招-智力题
一、赛马问题
1.1 问题描述
64匹马,8个跑道,问最少比赛多少场,可以选出跑得最快的4匹马?Assumptions:每场比赛每个跑道只允许一匹马,且不存在并列情形
1.2 解题思路
答案:11场比赛一定能选出;10场在特殊情况可以。
Step1:
首先不可避免地要赛八场,每场8匹马;然后对每组第一再赛一场,按照每组的速度编号:
- A1 > A2 > A3 > ------- >A8
- B1 > B2 > B3 > ------- >B8
- ~~
- ~~
- H1 > H2 > H3 > ------- >H8
且排序时按照A1 > B1 > C1 >~ > H1编号。
该步骤需要9场比赛。
Step2:
- 因为要选出前4名,所以,E1,F1,G1,H1所在的组淘汰;此时还剩16匹马。
A1 | B1 | C1 | D1 |
---|---|---|---|
A2 | B2 | C2 | D2 |
A3 | B3 | C3 | D3 |
A4 | B4 | C4 | D4 |
不难观察到:B4 ,C3,C4,D2,D3,D4不可能入围,因为它们前面至少有4匹马的速度确定比它们快。此时还剩下10匹马。且A1 一定是No.1,所以还剩9匹马待定。
- 然后任选8匹马进行比赛(剩余 C2 / D1),取出前3名,再与最后剩下的一匹比赛,从而得出第2~3名。加上A1是No.1,得出结果;因此共需10次一定可以找到前4匹马。
补充
当C1排名>=3时,不再需要进行第10场比赛;这种情况共需9场。
二、毒药与老鼠
2.1 问题描述
有1000个一模一样的瓶子,其中999瓶中装的是普通的水,一瓶是毒药,水和毒药只能通过老鼠来分辨,喝下毒药的老鼠会在一个星期后死亡(刚好一个星期)。现在你有一个星期时间,请问至少需要多少只老鼠才能确定出哪个瓶子装的是毒药?
2.2 解题思路
- 因为只有一个星期的时间,所以不能让一只老鼠每隔一个星期喝一瓶毒药,直到老鼠死亡。
- 最暴力的一种方法:999只老鼠各自喝一瓶;一星期后如果所有老鼠都没死,那最后一瓶就是毒药,反之,死亡的老鼠所对应编号就是那瓶毒药。
上面是最直白的思路,下面介绍一种二进制思路:
因为1000 < 2的10次方;所以1000瓶毒药可以从(0~999)按照10位二进制编号:
0 | 0000000000 | 995 | 1111100011 |
---|---|---|---|
1 | 0000000001 | 996 | 1111100100 |
2 | 0000000010 | 997 | 1111100101 |
3 | 0000000011 | 998 | 1111100110 |
4 | 0000000100 | 999 | 1111100111 |
选择10只老鼠,编号为1~10;让编号为 i 的老鼠喝下二进制中第i位下标为1的毒药。然后等待毒发。
结果分析:
第i只老鼠死亡,设该二进制位的值为1,否则为0;这样根据老鼠的死亡情况就可以得到一串唯一的二进制串。