過河問題 nyist 47

2021-06-18 09:05:13 字數 1162 閱讀 1506

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:5 描述

在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知;而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題是,如何設計乙個方案,讓這n人盡快過橋。 

輸入

第一行是乙個整數t(1<=t<=20)表示測試資料的組數

每組測試資料的第一行是乙個整數n(1<=n<=1000)表示共有n個人要過河

每組測試資料的第二行是n個整數si,表示此人過河所需要花時間。(0輸出

輸出所有人都過河需要用的最少時間

樣例輸入

1

41 2 5 10

樣例輸出

17

思路:

那麼這時將單獨過河所需要時間最多的兩個旅行者送到對岸去,有兩種方式:

1。 最快的(即所用時間t[0])和次快的過河,然後最快的將船划回來,再次慢的和最慢的過河,然後次快的將船划回來.

2。 最快的和最慢的過河,然後最快的將船划回來,再最快的和次慢的過河,然後最快的將船划回來.

這樣就將過河所需時間最大的兩個人送過了河,而對於剩下的人,採用同樣的處理方式,接下來做的就是判斷怎樣用的時間最少.

1。 方案1所需時間為:times[0]+2*times[1]+times[n-1]

2。 方案2所需時間為:2*times[0]+times[n-2]+times[n-1]

#include #include using namespace std;

#define maxn 1005

int times[maxn];

void input()

sort(times, times + n);

if (n == 1)

else if (n == 2)

else

if (n == 2)

else if (n == 3)

}cout << ans << endl;

}}int main()

南陽 47 過河問題

解題報告 首先按照過河時間從小到大排序,當n 3時候,就是考慮用最小時間先把用時最長的兩個人送過河,且手電筒仍然留在未過河的這邊,剩下的再依次求解。把當前用時最長的兩個人送過河可以考慮兩種方案 方案一 1 號和 2 號先過河,然後 1 號回來,n 號和 n 1 號過河,然後 2 號再回來 用時 2 ...

nyoj 47 過河問題

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...

NYOJ 47 過河問題

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...