晚上,有四个人过河,分别需要1、2、5、10分钟。只有一把手电筒,过河的必要条件是有手电筒。最多可以两个人同时过河,但必须以两人中较慢的那个人的速度过去。问:所有人都过河,至少需几分钟。

这是一个比较经典的智力题。我今天看面经遇到了,特地写下思路。

首先我们列下条件。

AB     2分钟

AC     5分钟

AD     10分钟

BC     5分钟

BD     10分钟

CD     10分钟

因为只有一个手电筒,所以必然存在有的人过去了之后又把手电筒拿回来用的情况,从AD,BD,CD的情况来看,必然是以CD的时间来算,因为C比A,B的时间都长,反正无论是谁跟D组合都是10分钟,所以我们选择一个时间最长的。这样一定是CD拿着手电筒过河,然后我们往前推一个下。谁把手电筒拿来的?因为A过河的时间最短,那我们让A把手电筒 拿过来吧,这样CD就拿着A拿过来的手电筒到达了河对岸。此时河对岸有BCD,那么BCD中,B时间最短,那么让B把手电筒拿过去,最后AB再一起过河。所以大概的情况是:

ab    2 去

a      1

cd  10 去

b      2 返

ad    2 去

time:2 + 1 + 10 + 2 + 2 = 17分钟。

思考下,K个人过河,同样的规则,方案是首先K个人排序,两个两个为一组,第一次,先让组合时间最小的队伍过河,然后在河对岸的人中找到用时最短的人把手电筒带回来。第二次就是第二小的组合,保证组合不变,每次带手电筒的人都是河对岸中,用时最少的人。大概是这么个思路,有待验证。

你可能感兴趣的:(数据结构与算法,面试)