设 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;