經典算法一 --- 過橋問題


題目:

在漆黑的夜里,四位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,四個人一共只帶了一只手電筒,而橋窄得只夠讓兩個人同時通過。如果各自單獨過橋的話,四人所需要的時間分別是1,2,5,8分鍾;而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題是,你如何設計一個方案,讓用的時間最少。

針對上篇算法題--過橋問題的解析如下

解答其實也容易,能者多勞這四個字就足以形容解答方案了——用時短的人必須要多跑幾趟以便傳遞手電筒。
設這四個人叫做A,B,C,D,他們所需要的時間分別是1,2,5,8分鍾。
第一步:A和B過橋,花費2分鍾。
第二步:A回來,花費1分鍾。
第三步:C和D過橋,花費8分鍾。
第四步:B回來,花費2分鍾。
第五步:A和B過橋,花費2分鍾。
這樣只要花費2+1+8+2+2=15分鍾,下面再來考慮如何用程序來解決這類問題,在寫程序之前還有個細節要考慮下,比如A,B,C,D四個人所需要的時間分別是1,8,9,10分鍾。
方案一
第一步:A和B過橋,花費8分鍾。
第二步:A回來,花費1分鍾。
第三步:C和D過橋,花費10分鍾。
第四步:B回來,花費8分鍾。
第五步:A和B過橋,花費8分鍾。
一共要8+1+10+8+8=35分鍾。
方案二
第一步:A和B過橋,花費8分鍾。
第二步:A回來,花費1分鍾。
第三步:A和C過橋,花費9分鍾。
第四步:A回來,花費1分鍾。
第五步:A和D過橋,花費10分鍾。
一共要8+1+9+1+10=29分鍾。
因此可以得出更加細化的解決方案——要么是最快者將最慢的2個送過橋,要么是最快的2個將最慢的2個送過橋。即將過橋的人按其過橋的時間從小到大排列,設為A,B,……Y,Z。其中A和B是最快的二個,Y和Z是最慢的二個。那么就有二種方案:
方案一 最快者將最慢的2個送過橋
第一步:A和Z過橋,花費Z分鍾。
第二步:A回來,花費A分鍾。
第三步:A和Y過橋,花費Y分鍾。
第四步:A回來,花費A分鍾。
這四步后總人數就減小2個,花費時間為A + A + Y + Z分鍾。
方案二 最快的2個將最慢的2個送過橋
第一步:A和B過橋,花費B分鍾。
第二步:A回來,花費A分鍾。
第三步:Y和Z過橋,花費Z分鍾。
第四步:B回來,花費B分鍾。
這四步后總人數同樣減小2個,花費時間為A + B + B + Z分鍾。
這樣,每次比較一下這二種方案就能將總人數減小2。然后我們再考慮一些邊界情況:
有三個人過橋設為A,B,C(已經排好序,下同)。應該花費A + B + C分鍾。
有二個人過橋設為A,B。那么肯定是花費B分鍾。
有一個人過橋設為A。肯定花費A分鍾。
所以 只需要比較 (B+B)>?(A+Y)
int m=((2B)>(A+Y))?2B:(A+Y)
總時間: B+A+Z+m

 

這道題對於Qi號有點難度,正在每天增加記憶當中,希望可以對大家有所幫助!


免責聲明!

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



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