http://blog.sina.com.cn/s/blog_65e729050100m7qy.html
環形公路不均勻分佈n個加油站,所有加油站的油加起來正好夠一圈,油箱一開始爲
空的,容量不限,且耗油均勻,問那個加油站出發可以跑完一圈
我們應該這樣考慮
A2表示A這點到下一點(B)的路程
令AA=A1-A2
AA+BB+CC+DD=0
A1-A2>=0 (AA>=0)
A1-A2+B1-B2>=0 (AA+BB>=0)
A1-A2+B1-B2+C1-C2>=0(AA+BB+CC>=0)
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
好了,剩下來的方法就是如何高效地找到這個點.如果我們注意觀察,其實算法很簡單:
當然,如果你還想提高效率,我們還可以做努力.我們假設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這點