飞机飞饶地球的问题,如何编程解决?17行代码就搞定??? ( 积分: 300 )

  • 主题发起人 主题发起人 Toysun
  • 开始时间 开始时间
T

Toysun

Unregistered / Unconfirmed
GUEST, unregistred user!
每架飞机只有一个油箱,飞机之间可以互相加油(注意是相互,没有加油机)一箱油可供一架飞机绕地球飞半圈
问:为使至少一架飞机绕地球飞一圈回到起飞时的飞机场至少需要出动几架飞机?
注意:所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场。
 
每架飞机只有一个油箱,飞机之间可以互相加油(注意是相互,没有加油机)一箱油可供一架飞机绕地球飞半圈
问:为使至少一架飞机绕地球飞一圈回到起飞时的飞机场至少需要出动几架飞机?
注意:所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场。
 
开始飞行:
N架顺时针,M架逆时针。。
慢慢飞着,我回家吃饭先。。
 
参照这贴的说明
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3195729
不过条件稍微不同,因为不能留油。
n> 5架
 
飞机要不停在前1/4圈和后1/4圈前来加油(逆向飞来),保证飞到前1/4圈的时候油箱满油,这样才可以飞中间的1/2圈,另外在飞到3/4圈刚好没油的时候,也要有飞机来送油。
因为送油的飞机自己无法折返,所以最多只能飞1/4圈,在飞到1/4圈时,可送的油量为0,
换言之,前后1/4圈的地方是临界点,前1/4圈前可加的油量越来越少直到0,而后1/4圈则从0开始可加油量越来越多,呈现连续线性关系,接近临界点时,要起飞送油的飞机从无限多架。
期待有非无限的答案,和有说服力的说明
 
这个题问的有错误,应该最后明确是出动几次飞机还是需要几架飞机
如果是出动几次 只需要8次
如果问几架 只需要3架
N年前就有了,传说中的微软测试题
其实楼上的说明,基本已经想到了,只不过没用同样的思想继续再想以下:
2边都可以接应加油,所以飞整个地球,就要在1/4的位置是满油飞到3/4圈时空油
这时只要考虑如何补上这家飞机飞1/4位置时需要的燃料就行了
三架飞机同时非,其中一架飞到1/8的时候,费了1/4的燃料,然后再给另一架飞机1/4的燃料,返回
这时另一架飞机飞了1/8,满燃料,然后剩下的2架飞机继续飞,飞到1/4位置时一架剩1/2燃料,一架剩3/4燃料,然后3/4燃料的飞机把1/2的燃料给另一架,返航
这时第一个返航的飞机补燃料飞出
这样就有一架飞机飞到1/4位置时满燃料了
另一架只剩1/4燃料的飞机向回飞,飞到1/8位置时无燃料,正好和补完燃料的第一个返航的飞机接头,这架飞机把1/4燃料给无燃料的飞机,2个同时返航
同样,飞整个地球的那个飞机飞到3/4位置时再由这2架飞机用同样的方法接应返回机场
 
另外问下 17行代码是什么意思?
 
设 N 架一起向一个方向起飞,最省油的方法就是当一架飞机的油可以抵回程和添满其它飞机油箱的时候: 那么很明显 第N架飞机走了 1/(n+1)油的 时候折回了。
然后就到 N-1号机了,当 飞行用了 k油 时,又将油分给 前面的 N - 2架。
k * (N - 2 + 2) := 1 - 1/(n +1)
前面飞机 + 自己在该路段的 油 = 全部油 - 返回时用的油
k解同样为 1/(n+1)油。前面的飞机一样同理。
由于由 N - 1架飞机供油,所以最多可走的路程为 1/2 * (1 + (n-1)/(n+1))
同理,反方向来的 M架飞机,最后的飞机不考虑折回的话是 1/2 * (1 + (m-1)/(m+1))的路程,当考虑折回时,很明显是 1/2 * (1 + (m-1)/(m+1)) / 3。
那么总路程很明显是
1 + (n-1)/(n+1) + 1/3* (1 + (m-1)/(m+1)) > 1 /(1/ 2)
稍稍可以求出 结果n + m = 6
不太成熟的枚举解法,不过我认为已经足够了:
Uses
Math;
function GetFlyTimes(FStep: Extended = 2): integer;
var
Pass: Extended;
i: integer;
begin
Result := 1;
if CompareValue(FStep, 1) <= 0 then
Exit;
for Result := 2 to maxintdo
for i := Result - 1do
wnto 1do
begin
Pass := 1 + (i - 1) / (i + 1)
+ 1 / 3 * (1 + (Result - i - 1) / (Result - i + 1));
if CompareValue(Pass, FStep) > -1 then
Exit;
end;
Result := -1;
end;
 
需要8架次
相对于满油航程为1
1架在1/3处返航,则自身使用1/3,节余1/3,返航1/3
1架同时飞到此地,承接节余的1/3油
飞到2/3处此机折回,交出1/3的油,此时可以回到1/3处恰好没油
第三架飞机飞到1/3处接机。
如此组合两组可以保证2/3处有2/3的剩余油料,
第七飞机到此可以家满油继续航行并返航至1/3,此时需要一架飞机接机即可
 
搬个板凳仔细看
 
多人接受答案了。
 
后退
顶部