題目描述:
在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知;而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題是,如何設計乙個方案,讓這n人盡快過橋。
輸入描述:
第一行是乙個整數t(1<=t<=20)表示測試資料的組數
每組測試資料的第一行是乙個整數n(1<=n<=1000)表示共有n個人要過河
每組測試資料的第二行是n個整數si,表示此人過河所需要花時間。(0前提
結論
當時間是1、4、5、8時
所以,四個人過河的方式,和時間有關
結論:如果(t1+t3)大於2t2,第二種方法優;如果(t1+t3)小於2t2,第一種方法優;如果(t1+t3)等於2t2,兩種方法無差異。
根據之前的分析,我們可以確定,每次如果只是送最慢的過河,之後燈要再回到對岸,則送最慢的人過河之後,剩餘的人過河時間不會被之前過河的人影響,所以,只要每次送過河的人時間最優,則總時間最短。
由上乙個例子可以看出來,可以由t1去送tn,t1回來,t1,送t(n-1),t1回來,這是,這相當於第一種方法,即一號送二號,再回來送三號,在回來,送四號。這個是乙個逐一由最快的人送燈的方法。
但四個人人的時候,還有乙個方法,就是用t1與t2送最慢的兩個人過河,就是第二種方法:一號和二號先過河,一號帶燈回來三四號拿燈過河,二號帶等回來,至此,一號二號送三號四號過河,一號二號又回到對岸,相當於第一中方法中一號送了兩次人(相送四號,再送三號),剩餘的n-2個人,又是乙個新問題,繼續這樣求解,只要選出這兩個人過河最快的方法就行。
方法一:tn+t1+tn-1+t1
方法二:t2+t1+tn+t2
選出最快的方法
#include#includeint an[1005];
int gh(int an,int n,int time);
int main()}}
while(n>=4)//迴圈
else
n-=2;//人數減二
}if(n<=3)
if(n==2)//一起過河
if(n==3)//一二先過河,一回來,和三過河
}printf("%d\n",time);
}return 0;
}
NYOJ47 過河問題(貪心)
題目描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的...
NYOJ 47 過河問題 (貪心)
時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...
nyoj47過河問題(貪心)
時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...