这是一道经典的贪心算法的题目。首先说一下我对这道题的理解:
n个人要过河,已知每个人的过河时间且过河时必须要使用唯一的手电筒。桥只能允许最多
两个人同时过河。让求所有人都过河后的最短时间。
我们不难知道:必须同时两个人过河,因为要把手电筒送回来,让为过河的人过河。使用贪
心的思想解决这个问题,首先要对这n个人的过河时间排序并保存在数组S中。这也是大多数贪心
解决问题的共同点。
根据贪心原则,我们有两个贪心策略:
策略A: 让最快的两个人去送最慢的两个人。首先S[0]和S[1]过河,S[0]把手电筒送回来,接着
最慢的两个人S[n-1],S[n-2]拿着手电筒过河。然后S[1]把手电筒送回来。注意:次慢的这个人相当
于没有花费时间就过去了(相对于策略B来说),这一点对于理解为什么要比较两种策略的最短时间
很重要。 此时S[0],S[1]都在未过河的这一岸,然后S[0],S[1]在接着送目前最慢的两个人S[n-3],
S[n-4],以此类推。
策略B:一直让最快的人送当前状态最慢的人。S[0]先把S[n-1],送到对岸,拿着手电筒回来,
再送S[n-2]。相当于单独一个人依次过河,再加上最快人的送手电筒的时间。
(未完持续)
时间: 2024-10-08 09:08:53