过桥问题和倒水问题
过桥问题和倒水问题都是笔试面试中的热门智力题,不但微软、GOOGLE、百度、腾讯等公司采用,甚至在IQ测试与公务员考试中都能见到。
在此整理下具体的做法。
过桥问题
在漆黑的夜里,四位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,四个人一共只带了一只手电筒,而桥窄得只够让两个人同时通过。如果各自单独过桥的话,四人所需要的时间分别是1,2,5,8分钟;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,你如何设计一个方案,让用的时间最少。
这个题目被微软、GOOGLE、百度、华硕、建设银行等很多公司用作笔试题或面试题。当然也有用在IQ测试中。
解答其实也容易,关键就是在于能者多劳——用时短的人必须要多跑几趟以便传递手电筒。
设这四个人叫做A,B,C,D,他们所需要的时间分别是1,2,5,8分钟。
更加细化的解决方案是:
1、要么是最快者将最慢的送过桥,
2、要么是最快的2个将最慢的2个送过桥。
即将过桥的人按其过桥的时间从小到大排列,设为A,B,…… Y,Z。其中A和B是最快的二个,Y和Z是最慢的二个。
那么就有二种方案:
方案一 最快者将最慢者送过桥
第一步:A和Z过桥,花费Z分钟。
第二步:如果桥那边还有人,则A回来,花费A分钟,没有人则不用回来。
这两步后总人数就减小1个,花费时间为A + A + Z分钟。
方案二 最快的2个将最慢的2个送过桥
第一步:A和B过桥,花费B分钟。
第二步:A回来,花费A分钟。
第三步:Y和Z过桥,花费Z分钟。
第四步:B回来,花费B分钟。
这四步后总人数同样减小2个,花费时间为A + B + B + Z分钟。
之后比较这两个方法的时间,找到时间消耗最小就行。
接下来就是代码时间:
假设一次过桥的人数最多是2人。
1 | package com.chain.blog.test.day09; |
测试结果:
1 | 4 |
倒水问题
这个题目的版本非常多,有微软版的,腾讯版的,新浪版的等等。
给你一个容量为5升的桶和一个容量为3升的桶,水不限使用,要求精确得到4升水。
解法肯定有很多,可以用宽度优先搜索(BFS),也可以用穷举法。
穷举法实现比较方便,其基本思想是用:用小桶容量的倍数对大桶的容量进行取余。
比如3升的桶和5升的桶得到4升水可以这样做:
3 % 5 = 3
6 % 5 = 1
9 % 5 = 4
成功得到4升水。(PS:上面的过程用如何用文字描述了?)
同样,用7升的桶和11升的桶得到2升水可以这样做:
7 % 11 = 7
14 % 11 = 3
21 % 11 = 10
28 % 11 = 6
35 % 11 = 2
成功得到2升水。
但是也需要注意下的就是可能存在无解的情况。
比如用2升的桶和4升的桶得到3升水。因为2和4的最大公约数是2即GCD(2,4)=2,而2无法整除3。
倒水问题也也容易推广到多个桶的情况,分析方法和上文差不多,这里就不再赘述了。