這個方法的名字是從一個大學同學那里得來的。算法本身非常簡單,但是這個名字太酷了,所以決定寫下來。
題目一:
一個管子里有N個球,它們都在以1M/S的速度(向左或向右)移動,在兩個球發生碰撞時,各自掉頭並且速度不變,問:多長時間之后N個球全部落地?
相信很多泡過論壇的人這個題目不只見過一次,而解決方法也很簡單。為了方便下面進一步的說明,這里贅述一下:
如果換個描述的方法:兩個球在相遇的時候,他們並沒有發生碰撞而是互相穿越而過(就像兩個鬼魂相遇時一樣),但是他們的編號互換了。顯然,這種描述和題目中的描述是等價的。在這種描述下問題就很好解決了,球與球之間並沒有發生碰撞,它沿着它開始的方向移動到對應的盡頭便落下,算出所有球中的最大值便是所有球落下的時間。
題目二:
描述同題目一,問:時間T時,求I的位置?
這個問題把題目一往前稍微提了一點點,因為這時候要考慮碰撞了(不然編號什么的都亂了)。這里想一下:
a、其他球的碰撞重要嗎?
b、相同方向的球可能相遇嗎?
為了更直觀的看問題,這里畫一個圖:
其中白色的球向右,黑色的球向左,標號為i的白球是我們要計算的,現在再來看上面的兩個問題。其他球發生碰撞的時候,對球I來說是沒有關系的,因為如擦掉球的顏色,在任何碰撞之后整體的情況對I球來說和擦身而過是相同的效果。相同方向的球因為速度相同,永遠也不可能相撞。但是,這里要考察的是I球的位置,所有I球的碰撞是需要考慮的。那么問題的解決方法便出來了:
a、忽略其他球之間的碰撞,只考慮I球和其他球的碰撞。
b、每個位置的球只可能和I球碰撞一次,因為碰撞之后方向變為同向。
到這里就差不多了,那么來看下碰撞的規律吧:
根據上面的a、b兩條,那么總是白球和黑球相撞,而每次相撞的時間點就是這兩個球之間的距離/2。顯然隨着碰撞時間遞增,所以可以依次計算每次碰撞的時間直到滿足時間,當然也可以用二分。
------------------------------------------
歡迎拍磚。