1. 64匹马,8个赛道,找出前4名最少比赛多少场?
这是一道经常考的智力题
64匹马,我们要想知道哪匹🐎跑的最快,前提条件是每一匹🐎都要去比赛一场。所以刚开始的赛马规则是每匹马都要进行一次比赛。
步骤1: 把 64匹🐎 8 个 8个分成一组,所以可以分成8组🐎(因为这是8个赛道所以8个8个分组)。然后进行每组的比赛,得到每一组内的排名。
步骤2: 由上一步我们可以知道每一组内的排名,来看看我们的要求, 找出前4名,所以我们可以排除每一组的最后4名,因为最后4名不可能属于前4名。这个时候还剩下 64 - 8 *4 =32匹🐎可以选择
步骤3:经过步骤2的筛选,还剩下32匹🐎,这个时候不做比赛 每一批都有可能是前4名,所以这个时候我们挑选出 8组中各自上一轮比赛的第一名进行比赛。在这次第一名的比赛中可以得到前4名和后4名,根据题目要求,我们可以排出后四名(假设这后四名为 一个group a),同时也可以排出这后四名对应的另外4 * 3 = 12匹马,这是因为这被排除的12匹🐎是第一名比赛那一轮被排除的四匹马(a)后面的12匹🐎,(最快的都没戏了,比最快慢点也没戏)。然后剩下32 - 16 = 16 匹马
步骤4:现在,经过上一轮的排查,还剩下16匹🐎,其中我们知道上一轮有4匹最快的🐎的排名以及每匹马各自小组内的组内排名(这个是在步骤一中比较出来的),由此我们可以确定这4匹最快马中,最慢的那一匹马的组内3个小伙伴马肯定可以被排除,因为如果 这匹最慢的马属于题目要求的话,那么前面那3匹比他快的马肯定是候选名额。同时可以排出倒数第二快马的组内的最后2匹马,原因和刚刚解释的一样,顺便排出倒数第三快那匹马的最慢小组成员,原因也和刚刚解释的一样。排除后,剩下的🐎都有可能成功前4,这个时候剩下 16 - 3 - 2- 1 = 10匹马。
步骤5: 我们可以确定最快的马 是步骤3中4匹马中最快的马,所以可以排除,剩下 10 - 1 = 9 匹马,在这9匹马中挑选8匹马进行比赛,但是还剩一批马不知道结果,所以还有可能要进行一次比赛,但是我说的是有可能,因为我们可以更具9 赛 8 的这场比赛推断出还要不要进行下一次比赛,从而有可能少比赛一次。方法: 步骤3中4匹马最慢的那匹不参加比赛,剩下8匹马参加,这8匹马中找到最快的3匹马,如果最快的3匹马的第一名或者第二名包含 步骤3中4匹马倒数第二快的马的话,那么就要再进行一次比赛来判断步骤3中4匹马最慢的那匹要不要比赛,否则 就不用判断,这个道理还步骤4中提到的原因类似。
综上所述:一共要进行 1 + 1 + 1 + 1(2) 次比赛,既4次比赛或者5次比赛
道理如下图所示:
图片参考自:腾讯面试:赛马问题【超详细图解】64匹马,8个赛道,找出前4名最少比赛多少场?_有温度的算法的博客-CSDN博客_64匹马8个跑道
2.
烧绳子
燃烧一根不均匀的绳子需要一小时,怎么做才能问如何度量出半个小时,45分钟,75分钟?
烧绳子问题:
首先,题目条件是绳子不均匀,所以我们不能再绳子上面画线决定烧多长时间。
步骤1:题目说🔥一根绳子需要1小时,也就是说从一边烧需要一小时,如果我从两头同时烧,那是不是只需要半小时烧一根绳子。这样我们就得出了半小时需要的时间。
步骤2: 找出45分钟,更具上一个步骤,一个绳子两边一起烧,就可以得到30分钟,这个时候准备两根绳子,一根绳子从两头烧,一个绳子从一头烧,两根绳子一起烧。我们可以知道 两根一起烧的时候,两头烧的那个先烧完,烧了30分钟,当两头一起烧的那个绳子先烧完了,一头烧的也烧了30分钟,如果这样放纵下去不管这根绳子继续烧的话,还会烧30分钟,但是这个时候我们把这个一头烧的绳子另外一头点燃让它两边一起烧,相当于加二倍速度烧,同时开始从0计时,等这根绳子烧完了停止计时,那么这个时候记录等时间就是15min的。所以要计算45分钟,那么就准备两根绳子,一个从一头烧,一个从两头烧,然后开始计时等到两头烧的刚烧完,把另外那个一头烧的绳子点燃另外一头,等这个绳子烧完,就是45分钟的时间。
步骤3:找出75分钟
需要3根绳子,步骤和步骤2类似,只不过再多烧一根绳子就ok了。
倒水
- 如何用5L和7L的杯子,倒出6L水?
首先,我们要知道只有7L的水才能装的下6L的水,所以最终6L水是在7L的杯子里面。
步骤一:给7L的杯子倒满水,然后把杯子里的水倒给空的5L的杯子里面,倒满,这个时候7L杯子里面还剩下2L水,把5L杯子里面的水倒空出(让5L杯子空),把这2L水倒入5L杯子里面,此时5L杯子里面有2L水,再给7L的杯子里面倒满水,然后倒入5L的杯子里面把它倒满(只能倒入3L)此时7L里面的水还剩4L,把5L杯子里面的水全倒出来,然后把这4L导入5L杯子里面,然后再给7L杯子倒满。注意⚠️,见证奇迹的时候要来了:用7L的杯子给5L的杯子倒满(只能倒入1L因为5L杯子里面有上回合的4L),7L杯子里面还剩下 7 - 1 = 6L的水,结果出来!
2.如何用5L和6L的杯子,倒出3L水?
和上面的步骤类似:
6L水倒入5L空杯,此时剩下1L,把5L倒空然后把1L倒入
6L水倒入5L杯子(含有1L水的杯子),此时还剩2L,把5L倒空,然后把2L倒入
6L水倒入5L杯子(含有2L的杯子),此时就剩下3L水在6L杯子里面了,因为最多能往5L杯子倒入3L水
毒药问题
1000瓶水,其中有一瓶可以无限稀释的毒药,要快速找出哪一瓶有毒,需要几只小白鼠?
用2进制的观念去解决这个问题。
2的10次方是1024,也就是说至少要 10个bit表示1000 10个bit位最多能表示1024 - 1= 1023.
需要10只小白鼠,每一只小白鼠代表一个bit。
给1000瓶水编号,从1 - 1000
然后计算步骤开始:
从第一瓶开始 找到毒药编号的2进制码,找到编号bit位为1的位置,然后找到相对应小白鼠,给把毒药喂给每只小白鼠对应对水中。混合好后让小白鼠喝水,找出死掉的小白鼠,算出来对应编号的毒药
先手必胜策略问题
两个人,100本书,每次一个人能够拿1-5本,怎么拿能保证最后一次是你拿?
最后一次是我拿的话,那么我可以拿1 - 5本书,再我拿之前,那个人也可以拿1-5本书,所以为了保证我能最后一次拿到书,要让那个人在倒数第二次拿书的时候至少在他拿之前,还剩下6本书。
所以要保证书的总数在6的倍数。
要保证书的总数一直是6的倍数,就得我先拿,所以100本书的话我刚开始要拿4本 还剩下96本。
然后让他随便拿,但是我拿书的目的就是让剩余书的总数保持6的倍数就可以了。
在24小时里面时针分针秒针可以重合几次?
首先我们要计算12小时里面 时针和分钟重合几次,从12点开始算 重合一次 然后在 从 1 - 11 这个区间每个区间会重合一次 既10次,但是在12 - 1 和11 - 12这个区间只会重合 一次也就是12点(这个地方比较坑)所以12小时里面一共重合11次, 24小时就重合22次。
再来看秒针,这三个针要一起重合的条件是,分针时针必须重合,秒针速度比较快,所以找到相对慢的两根针,重合的时间就是找到三针重合的时间。
所以最终结果是 重合22次。