從數學角度來研究過河問題
一、問題描述
在漆黑的夜裡,甲乙丙丁共四位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋的。不幸的是,四個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,四人所需要的時間分別是1、2、5、8分鐘;而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題:如何設計乙個方案,讓這四人盡快過橋。
二、問題答案
兩人過橋後,需要把手電筒送回,最容易想到的是讓最快的人擔任來回送電筒。因此,第一種辦法:先讓甲乙過去(2分鐘),甲回來(1分鐘),甲丙過去(5分鐘),甲回來(1分鐘),甲丁再過去(8分鐘),總共需要17分鐘就可以讓四個人都過去。
而正確答案是第二種辦法:先讓甲乙過去(2分鐘),甲回來(1分鐘),丙丁過去(8分鐘),乙回來(2分鐘),甲乙再過去(2分鐘),總共需要15分鐘就可以讓四個人都過去。這種方法的關鍵點,讓兩個最慢的人同時過橋。
三、擴充套件
把四人所需要的時間,改變一下分別,是1、4、5、8分鐘。
第一種方法:先甲乙過去(4分鐘),甲回來(1分鐘),甲丙過去(5分鐘),甲回來(1分鐘),甲丁再過去(8分鐘),總共需要19分鐘就可以讓四個人都過去。
第二種方法:先讓甲乙過去(4分鐘),甲回來(1分鐘),丙丁過去(8分鐘),乙回來(4分鐘),甲乙再過去(4分鐘),總共需要21分鐘就可以讓四個人都過去。
這一次,兩個最慢的人一起過去反而更慢了。
這兩次方案的差異:次快的人要不要也傳遞一次手電筒。
假定四個人過河時間是t1,t2,t3,t4且t1<t2<t3<t4,如何選擇過橋方案。
第一種過河方法的總時間為:t2+t1+t3+t1+t4
第二種過河方法的總時間為:t2+t1+t4+t2+t2
二者之差為:(t1+t3)-2t2。
結論:如果(t1+t3)大於2t2,第二種方法優;如果(t1+t3)小於2t2,第一種方法優;如果(t1+t3)等於2t2,兩種方法無差異。
四、問題推廣
現在我們把這個問題推廣:如果有n(n大於等於4)個旅行者,假設他們有各自所需的過橋時間有快有慢,各不相同。在只有乙隻手電筒的情況下,要過上述的一條橋,怎樣才能找到最快的過橋方案?
現在我們假定,n個人單獨過橋的時間分別是t1,t2,t3,……,tn,且滿足t1<t2<t3<…… <tn。
經過分析,要滿足最快過橋,合理的安排包括以下幾點:
1)讓最快的送手電筒的次數盡可能多些。
2)某些方案中,次快的也送電筒也可能會電筒。
3)讓慢的過橋次數盡可能少些;
4)最快的兩個先過橋,以保證此二人是能來回送電筒的人;
借助上述結論,來逐步分析多人情形。
當n=5人時,第一次先t1、t2兩人過橋,t1把電筒送回,沒過橋的又變成了t1、t3、t4、t5的4人情形。這個時候,需要比較t1+t4與2t3的大小嗎?
兩種方案兩者之差為t1+t4-2t2,這裡與t3沒有關係。
當n=6人時,第一次先t1、t2兩人過橋,t1把電筒送回,沒過橋的又變成了t1、t3、t4、t5、t6 的5人情形。按照剛才的分析,要比較t1+t5-2t2的大小。
以此類推,兩種方案的差異,只與最快的人、次快的人和次慢的人的單獨過橋時間有關,而與其他人的快慢無關。
#include#includeusing namespace std;
int main()
n-=2;}}
printf("%d\n",sum);
}}
sql server分頁的兩種方法比較
在sql server資料庫中,如果乙個查詢結果資料量比較大,就需要在查詢的時候分頁,每次只返回其中一頁。下面就將為您講解比較sql server分頁的兩種方法,如果您對sql server分頁感興趣的話,不妨一看。sql server分頁第一種方法 思路是根據頁號取出兩部分資料,比如取出前90條,...
兩種方法解決約瑟夫問題
第一種 構建迴圈鍊錶,然後不斷遍歷鍊錶直到剩下最後乙個元素。include include include include include include using namespace std typedef struct list list,link int main p next head n...
兩種方法解決排列問題
time limit 1.000 sec memory limit 128 mb problem description 有4個互不相同的數字,請按序輸出由其中三個不重複數字組成的排列。input 4個整數。output 所有排列,輸出順序見樣例。sample input 1 2 3 4 out i...