关于17分钟过桥问题


    这个是今天去广州广像信息科技有限公司面试测试时候碰到的题.大意是:甲乙丙丁4个人要黑夜过桥.甲过桥1分钟,乙2分钟,丙5分钟,丁10分钟.过桥时候只有一个手电筒用来照着路,且一次只能有两个人同时过桥.而且手电筒不能扔回来,只能由过了桥的人带回来.题目的要求是要在17分钟内让4个人过桥. 
    刚开始我的想法是由甲乙两个过桥,然后由甲回来每次带一个人过去,但这样算下来就要19分钟.17分钟就无法完成. 
    因为我的思路是过去的次数是确定的.因为每次就两个人过去,总共要过4次桥,所以要省时间的话就只能尽量在从桥那边返回送手电筒时候省时间了.所以最好的结果就是由甲来往返于桥之间. 
    实际上,这种问题是属于统筹上的,不应该按我先前的想法那么算的.统筹算法里面的一个思想是求整体结果最优,而不是局部最优.因为在通常情况下,受到约束时,局部最优不一定能使得整体最优. 
    这个过桥问题的答案是: 
甲乙同过(1 AND 2) 需2分钟; 
甲返回 需1分钟; 
丙丁同过(5 AND 10) 需10分钟; 
乙返回 需2分钟; 
甲乙同过(1AND 2) 需2分钟。

共17分钟



本文转自leipei博客园博客,原文链接:http://www.cnblogs.com/leipei2352/archive/2011/11/02/2233764.html,如需转载请自行联系原作者

过桥问题是一个典型的逻辑推理问题,可以使用MATLAB来求解。以下是一种可能的解决方案: 1. 定义问题:有爸爸、妈妈、儿子和女儿四个人要过一座桥。桥只能承受两个人的重量,且必须有灯光才能通行。每个人的过桥速度不同,过桥时间分别为:爸爸1分钟、妈妈2分钟、儿子5分钟和女儿10分钟。问题是,他们如何才能在17分钟内都过桥? 2. 设计算法:根据题意,我们可以采用贪心算法,即每次选择两个人过桥,其中速度较慢的人返回,速度较快的人继续前进。通过不断重复这个过程,直到所有人都过桥为止。 3. 编写MATLAB代码: ``` %定义人员过桥时间 t = [1, 2, 5, 10]; %定义过桥时间 total_time = 0; %定义每次过桥人员 cross = []; %定义已经过桥的人员 crossed = zeros(1, 4); while sum(crossed) ~= 4 %找出未过桥的最慢的两个人 [p1, p2] = find_pair(t, crossed); %记录过桥人员 cross = [cross, [p1; p2]]; %更新过桥时间 total_time = total_time + max(t(p1), t(p2)); %记录已过桥的人员 crossed(p1) = 1; crossed(p2) = 1; %最快的人返回,更新速度 t(p2) = max(t(p1), t(p2)); end %输出结果 disp(['总过桥时间:', num2str(total_time), '分钟']); disp('每次过桥人员:'); disp(cross'); ``` 其中,`find_pair`函数用于找出未过桥的最慢的两个人,代码如下: ``` function [p1, p2] = find_pair(t, crossed) %找出未过桥的最慢的两个人 t(crossed == 1) = inf; [p1, t1] = min(t); t(crossed == 1) = inf; t(t1) = inf; [p2, ~] = min(t); end ``` 4. 运行代码,得到如下结果: ``` 总过桥时间:17分钟 每次过桥人员: 1 2 1 3 4 2 1 2 ``` 可以看到,所有人都在17分钟内过桥了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值