NYOJ 47 過河問題 貪心

2021-08-04 05:03:38 字數 1535 閱讀 4748

時間限制:

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

//這道題剛開始有點難想到

//起初我以為,2個最小的(標記為min1和min2)先過去,然後讓最小的(min1)那個帶燈回來,然後再讓最大的2個人(max1,max2)過去

//然後再讓min2回來,再帶min1過去,然後min1回來,然後繼續讓還沒過橋的最大的2個過去,依次迴圈下去

//樣例 1 2 5 10

//(1,2)過去(耗時2),1回來(耗時1),(5,10)過去(耗時10),2回來(耗時2),(1,2)過去(耗時2),共2+1+10+2+2 = 17

//然後...提交,wa

//下面再看一組資料 1 4 5 8

//如果按照上面的做法,最終結果會是4+1+8+4+4 = 21 (視為第一種方法)

//然而可以這樣,(1,4)過去(耗時4),1回來(耗時1),(1,5)過去(耗時5),1回來(耗時1),(1,8)過去(耗時8),共4+1+5+1+8 = 19(第二種)

//通過這兩組資料可以發現,需要判斷要不要讓min2回來

//如果讓min2回來,那麼讓2個最大的過去的時間會是max1+min1+2*min2;

//不讓min2回來,那麼讓2個最大的過去的時間會是max1+max2+2*min1;

//所以需要判斷max1+min1+2*min2和max1+max2+2*min1的大小,即2*min2和min1+max2的大小

//if(2*min2>=min1+max2)則採取第二種,否則採取第一種

#include #include using namespace std;

priority_queue, greater>q1; //存還沒過橋的人,時間是小到大

priority_queue, less>q2; //存還沒過橋的人,時間是大到小

priority_queue, greater>q3; //存已經過橋的人,時間是小到大

int main()

else

}printf("%d\n", sum);

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