飞机加油问题,据说是微软的面试题。

来源:互联网 发布:搞笑的网络歌曲 编辑:程序博客网 时间:2024/05/17 07:30

昨天晚上在 http://community.csdn.net/Expert/topic/3638/3638447.xml?temp=.7129938

看到这道题,很有趣,试着求解一番。

关于飞机加油问题:
1.首先确定问题可以求解。
  要使所有飞机安全飞回那么,加油点之间的距离肯定不能超过1次加满油飞行的距离。
可以肯定加油点除了 1/2处不能设定外,其余各点都可以设定加油点。(理由见后面)
于是问题有解。

2.
假设飞机从按照逆时针,从东飞到西。
有n架飞机同时起飞。
地球一圈长度为f

对逆时针飞行加油点。
第k架在x[k]处返回。
y[k]是从x[k-1]处开始飞行到有飞机折回的距离
如下关系如下:
x[1]= y[1];
x[2]= x[1]+y[2];
x[3]= x[2]+y[3];
x[k]= x[k-1] + y[k];(k=1,2,3...n-1);
x[k] < 0.5f;
k的最大取值是 n-1因为 2台飞机只能一次油,3台飞机最多可以加两次油。


要保证飞机能飞最远,就是使每一架飞机在折回后不折回的飞机的油是满的。
所以有:

 0.5f - 2*y[1]          = (n-1)*y[1];
 0.5f - 2*y[2] - x[1]   = (n-2)*y[2];
 0.5f - 2*y[3] - x[2]   = (n-3)*y[3];
 0.5f - 2*y[k] - x[k-1] = (n-k)*y[k];(k=1,2,3...n-1);
 
 变形一下
 0.5f = (n-1+2)*y[1];
 0.5f = (n-2+2)*y[2] + x[1];
 0.5f = (n-3+2)*y[3] + x[2];
 0.5f = (n-k+2)*y[k] + x[k-1] ;
 (k=1,2,3...n-1);

 解出 x[k]的表达式:

x[1] = y[1] = 0.5f/(n+1) ;
x[2] = 0.5*2/(n+1);
x[3] = 0.5*3/(n+1);
....
x[k] = 0.5f*k/(n+1);

由于 x[k] 必须小于 0.5f 否则谁都不愿意开那架飞机了。
就是说 k/(n+1) 只须小于 1即可(但不能等于1),
要想使x[k]尽量远,那么就要保证 k/(n+1)尽量大。
k和n都比必须使正数。而且k最大只能取 n-1
所以k=n时,k/(n+1) = (n-1)/(n+1)
这时可知,n趋向于无穷大时,(n-1)/(n+1)  趋向于1,
(而且也可以得知 n越大k才能越大)
因此加油点可以遍布整个右半球,但是1/2点处不能到达。


对顺时针飞行加油点。
同样的思考方式。同样的结果。

同时还有结论:
根据
  y[k] = x[k] - x[k-1] = 0.5f/(n+1)
可知:
n越多,那么加油站点之间的距离就会越小(得到加油站点之间距离表达式跟次数无关的无关的结论我也很诧异)。

由前面的推论:
x[k] = 0.5f*k/(n+1);
可知最远的加油站是
x[k] = 0.5f*(n-1)/(n+1);
他也只和 n相关。
所以 x[k] 越远他需要的 飞机数量越多。

由于飞机满油能飞,0.5f所以要想达到最优化,
就要使飞机落在0.5f里面的区域的每一点都比区域外面的点的需要的飞机数要少(假定在需要比较的点设置加油站的话)
由于两边都是对称的,而且从出发点到地球的另一端点的过程种,各点(如果要设置加油站的话)需要的飞机数使递增的。
所以,我们可以轻松的推定,0.5f 均匀的分布在地球另一端点的两边。(这部分也可以用证明,时间关系,暂略)

所以只需要在两个方向安排同样数量n的飞机布置最远的加油点在离出发点 1/4 f的地方或更远一点就可以了。

问题演变成
x[k] >= 1/4 f
x[k] < 0.5f
取 k的最小整数值

x[k] 的最远点的表达式是  x[k] = 0.5f*(n-1)/(n+1);

也即
0.5f*(n-1)/(n+1) >= 1/4 f
0.5f*(n-1)/(n+1) < 0.5fn>0

求最小的 n
解之得
n >= 3
所以n得最小取值是3
也就是 需要 6架次。 但最少只需要3架飞机。

过程如下:
逆时针起飞第一次加油点在  x[1] = 1/8 f处。然后有一架飞机返回。
第二次加油在 x[2] = 1/4 f处,一架飞机返回。

在逆时针飞行的飞机飞过 0.5f 处时,顺时针派出3架飞机,(可以重用以前的飞机,如果允许的话)
第一次加油处也是 1/8 f 一架飞机飞回
第二次在1/4f 同时 逆时针飞行的飞机也到达,将油均分后每个飞机一半的油。同时飞回来。
可以抵达出发点。

原创粉丝点击