nyoj47 過河問題(貪心演算法) 演算法筆記

2021-09-24 15:46:05 字數 1325 閱讀 5693

題目描述:

在漆黑的夜裡,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人所需要的時間已知 而如果兩...