飛機加油問題,據說是微軟的面試題。

昨天晚上在 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 同時 逆時針飛行的飛機也到達,將油均分後每個飛機一半的油。同時飛回來。
可以抵達出發點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章