鬼魂算法


這個方法的名字是從一個大學同學那里得來的。算法本身非常簡單,但是這個名字太酷了,所以決定寫下來。

題目一:

一個管子里有N個球,它們都在以1M/S的速度(向左或向右)移動,在兩個球發生碰撞時,各自掉頭並且速度不變,問:多長時間之后N個球全部落地?

相信很多泡過論壇的人這個題目不只見過一次,而解決方法也很簡單。為了方便下面進一步的說明,這里贅述一下:

如果換個描述的方法:兩個球在相遇的時候,他們並沒有發生碰撞而是互相穿越而過(就像兩個鬼魂相遇時一樣),但是他們的編號互換了。顯然,這種描述和題目中的描述是等價的。在這種描述下問題就很好解決了,球與球之間並沒有發生碰撞,它沿着它開始的方向移動到對應的盡頭便落下,算出所有球中的最大值便是所有球落下的時間。

題目二:

描述同題目一,問:時間T時,求I的位置?

這個問題把題目一往前稍微提了一點點,因為這時候要考慮碰撞了(不然編號什么的都亂了)。這里想一下:

a、其他球的碰撞重要嗎?

b、相同方向的球可能相遇嗎?

為了更直觀的看問題,這里畫一個圖:

其中白色的球向右,黑色的球向左,標號為i的白球是我們要計算的,現在再來看上面的兩個問題。其他球發生碰撞的時候,對球I來說是沒有關系的,因為如擦掉球的顏色,在任何碰撞之后整體的情況對I球來說和擦身而過是相同的效果。相同方向的球因為速度相同,永遠也不可能相撞。但是,這里要考察的是I球的位置,所有I球的碰撞是需要考慮的。那么問題的解決方法便出來了:

a、忽略其他球之間的碰撞,只考慮I球和其他球的碰撞。

b、每個位置的球只可能和I球碰撞一次,因為碰撞之后方向變為同向。

到這里就差不多了,那么來看下碰撞的規律吧:

根據上面的a、b兩條,那么總是白球和黑球相撞,而每次相撞的時間點就是這兩個球之間的距離/2。顯然隨着碰撞時間遞增,所以可以依次計算每次碰撞的時間直到滿足時間,當然也可以用二分。

------------------------------------------

歡迎拍磚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM