時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:5
描述
在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知;而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題是,如何設計乙個方案,讓這n人盡快過橋。
輸入
第一行是乙個整數t(1<=t<=20)表示測試資料的組數
每組測試資料的第一行是乙個整數n(1<=n<=1000)表示共有n個人要過河
每組測試資料的第二行是n個整數si,表示此人過河所需要花時間。(0輸出
輸出所有人都過河需要用的最少時間
樣例輸入
141 2 5 10
樣例輸出
17
**poj
解題思路:
首先按照過河時間從小到大排序,當n>3時候,就是考慮用最小時間先把用時最長的兩個人送過河,
且手電筒仍然留在未過河的這邊,剩下的再依次求解。
把當前用時最長的兩個人送過河可以考慮兩種方案:
方案一:
1 號和 2 號先過河,然後 1 號回來,n 號和 n-1 號過河,然後 2 號再回來
用時:2*a[2]+a[1]+a[n];
方案二:
1 號和 n 號先過河,然後 1 號再回來,1 號和 n-1 號再過河,之後 1 號再回來
用時:a[n]+a[n-1]+2*a[1];
所以每次把用時最長的兩個人送過河用時應該取上述兩種方案中的最小值。至於為什麼要先考慮
把用時最長的兩個人送個和用的是貪心的思想,因為只有兩個用時最長的兩個人一塊過河才能保證
用時次長的人不會占用過河時間,將時間降到最低(我是這樣考慮的,不知道對不對。。)
**如下:
1 #include 2 #include 3 #include 45using
namespace
std;67
int a[1005];8
9int min(int a, int
b)10
1314
int fun(int
n)1524}
2526
intmain()
2738
return0;
39 }
nyoj 47 過河問題
時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...
NYOJ 47 過河問題
時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...
nyoj 47 過河問題
時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...