環路公路難題


http://blog.sina.com.cn/s/blog_65e729050100m7qy.html
環形公路不均勻分佈n個加油站,所有加油站的油加起來正好夠一圈,油箱一開始爲
空的,容量不限,且耗油均勻,問那個加油站出發可以跑完一圈
 
這個問題好像是via的c++筆試題目。我想了好久(~1h),覺得:
 
其實這個問題可以衍生爲:
 
1. 跑完全程的路線是否一定存在
2. 如果正向存在,反向是否一定存在
3. 怎麼找到起點加油站,如果有很多起點都可以跑完,怎麼找到所有的起點
 
我的解答參回覆。誰有好的想法儘管發啊
 
 
======================================
仔細考慮了一下,我第一次回覆的算法不妥,下班後在公交車上就開始想,到現在終於想到一個比較完滿的做法

我們應該這樣考慮
假設這個圓周上有4個點,分別是A,B,C,D
A1表示A這點油庫可以跑的路程
A2表示A這點到下一點(B)的路程
令AA=A1-A2
依次類推,BB=B1-B2, CC=C1-C2, DD=D1-D2
到了最後,我們就有AA,BB,CC,DD四個數據
由於A1+B1+C1+D1=A2+B2+C2+D2, 所以有:
AA+BB+CC+DD=0
假設我們從A出發,能夠順利以D結束,我們就需要滿足:
A1-A2>=0 (AA>=0)
A1-A2+B1-B2>=0 (AA+BB>=0)
A1-A2+B1-B2+C1-C2>=0(AA+BB+CC>=0)
當然,上面只是假設.其實我們真正需要做的,是在AA,BB,CC,DD這四個數據中,找滿足下面任意一種條件:
1. AA>=0 AA+BB>=0AA+BB+CC>=0
2. BB>=0 BB+CC>=0BB+CC+DD>=0
3. CC>=0 CC+DD>=0CC+DD+AA>=0
4. DD>=0 DD+AA>=0DD+AA+BB>=0
只要找到了,我們就可以從相關的點出發.比如我們找到滿足條件3, 我們就可以從C點出發

好了,剩下來的方法就是如何高效地找到這個點.如果我們注意觀察,其實算法很簡單:
從AA開始,分別計算AA, AA+BB,AA+BB+CC. 如果其中某一次計算的結果<0,直接跳到下一個數據.比如我們發現AA+BB+CC<0,由於前面已經AA+BB>=0已經通過,所以CC必然<0,由於CC<0, 我們肯定不能夠用C作起點,所以我們就直接從CC的下一個數據,DD開始計算.當找到可以滿足條件的結果後,我們就找到了起點. 從這個算法可以看到,效率是o(n), 一次循環就搞定了.

當然,如果你還想提高效率,我們還可以做努力.我們假設AA,BB,CC,DD都不等於0,也就是說他們或正或負。我們可以很簡地得出,起點肯定是在由負變正的時候產生。所以我們在選擇起點的時候,通過這個方法可以平均淘汰掉大約3/4的點

也就是說,算法可以表示如下:

1.假設加油站分佈在N1,N2..Nn點上,N1(1)表示N1這點油庫可以跑的路程,N1(2)表示N1這點到下一點(N2)的路程,令NN1=N1(1)-N1(2),依次類推
2. 將NN1,NN2,..NNn放入環形鏈表中
3. 從NN1開始,計算NN1,NN1+NN2,...一直到NN1+NN2+..+NNn.
4. 在第三步,如果有NN1+NN2+..+NNx<0, 以NNx+1開始,重複第三步計算
5. 環形鏈表跑完以後,得到由NNx開始的所有計算結果>=0, 那麼起點就是Nx這點
有人有興趣用C來實現一把麼?
發佈了27 篇原創文章 · 獲贊 15 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章