IT狼闲评

笑谈IT,IT谈笑, 笑着,写作、创新与创造 Laugh,Writing and Programming...

Google

星期四, 十月 12, 2006

飞机加油问题解---地球是圆的啊

1 飞机加油问题的解法 /* 已知: 每个飞机只有一个油箱,飞机之间可以相互加油(注意是相互,没有加油机);一箱油可供一架飞机绕地球
飞半圈. 问题: 为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?*/
/* 思路: 在起点,加油机先于目的机起飞没有意义——在空中瞎转悠也是要耗油滴。加油机后 于目的机起飞?。。。。。。。 在任一个加油点,理想的情况是,加油机留够回程(==已飞行路程)用油后将多余 部分平均分配给其他飞机(平不平均无所谓,反正他们可以加来加去)。 因为在前半程,最后的故事总是在1/4路途处,硕果仅存的加油机给目的机加满后安全 返回。 所以我把每次加油时发生的地点设定为加油机能够把剩余的飞机加满后安全返回的 地方。(关于这一点是否最合理我不太能确定~~~~~~ ,先按这么假设吧,以后再慢慢想~~ 木谷实:再想一百万年也不嫌累啊~~~)
设在起点同时起飞n架飞机,半圈的路程对应一箱油所以设为1,每个加油点离上一个 加油点的距离设为kk(当然,起点机场就是加油点id 0),目的机已经飞行的路程为k=0。
那么,第一个加油点距离起点的路程是:
/* kk==(1-2*kk)/(n-1)
/* kk==1/(n+1)
第一架加油机完成使命后,剩下的n-1架飞机飞行的路程是: k += kk; 带着满满滴油箱1继续前行~~~ 现在来看第二架加油机加油的点离第一加油点的距离:
/* (n-1)*kk == 1-k-2*kk
/* kk == (1-k)/(n+1)
飞行路程 k += kk 继续前行的飞机数量 n--
以后每一个加油段都有:
/* (n-1)*kk = (1 - k) - 2*kk /* kk = (1 - k) / (n + 1)
然后 k += kk; n--; 直到 k == 1 / 2,且 n == 2 。
这样,俺们的编码就可以从 k == 1 / 2, n == 2 开始倒推,看看 k == 0 时 n 到底是多少。 */
#include
int main()
{ int n = 2; float k = 0.5, kk;
while(k > 0)
{ kk = (1 - k) / (n + 1);
k -= kk;
n++;
}
printf("%d",n); getchar(); }

/* 结果是5架,4架用来加油,每到六分之一(一指一箱油或半圈的路程)处加一次油 。 后半圈需要5架飞机去迎接目标机,过程和前半圈相同,只是第五架飞机倒了半程 四分之一圈) 时不再往前飞了,而是把一半的油加给目标机然后掉头一起回家。 所以答案应该是10架次吧? 请明白人指点啊~~~~ 在费了半天劲后后头一看,这TMD难道可以算是编程题吗?*/

0 Comments:

发表评论

<< Home

GSnewsBar Sample
Loading...