NYOJ 47 過河問題

2021-08-13 07:26:07 字數 1415 閱讀 4040

時間限制:

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

我們知道,當小於4個人的時候,很容易想明白,當n>=4的時候,一開始考慮貪心演算法,確實有點沒有頭緒,但想到貪心,應該從區域性最優到全域性最優出發,我們知道,當4個人的時候,我們把a[1]`a[4]遞增排序,有兩種情況:

第一種:a[1]+a[4],a[1]回來,a[1]+a[3],a[1]回來,a[1]+a[2],所用時間a[4]+a[1]+a[3]+a[1]+a[2]

第二種:a[1]+a[2],a[1]回來,a[3]+a[4],a[2]回來,a[1]+a[2],所用時間a[2]+a[1]+a[4]+a[2]+a[2]

這時候我們我們應該發現兩個問題,這兩種情況差值(a[1]+a[3])-(a[2]+a[2])需要再做比較,第二,如果推廣到n維,我們要發現這裡面的一些共性,兩種路徑最後都是送走了a[1]+a[2],換句話說,只是送走a[3]和a[4]的時候出現比較情況,如果推廣到n維,a[n]的時間是一定要花費的,那麼如果第二種情況最優的話,我們可以帶走乙個次大值,繼而我們判斷貪心過程就是在n>=4的時候,每次a[1]、a[2]和最大值和次大值的貪心過程。只是如何判斷只有這兩種情況中存在最優,需要自行腦補一下……

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

int t[1005];

bool cmp(int a, int b)

int times;

void t(int num)

if (num == 2)

if (num == 3)

if (num >= 4)

}int main()

return 0;

}

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人所需要的時間已知 而如果兩...