過河問題 貪心 陣列

2021-08-16 21:35:55 字數 1848 閱讀 8732

時間限制:1000 ms  |  記憶體限制:65535 kb

難度:5

描述

在漆黑的夜裡,

n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,

n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,

n人所需要的時間已知;而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題是,如何設計乙個方案,讓這

n人盡快過橋。

輸入

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

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

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

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

樣例輸入

1
4
1 2 5 10
樣例輸出

17
菜鳥分析:先時間排序,時間從小到大,速度從快到慢,a[1],a[2],a[3],........a[n-1](從一開始對應解釋)

乙個人過:時間確定a[1]

兩個人過:時間相同不拖累,速度不同的兩個人一起,按走得慢的 a[2]

三個人過:最快a[1]的和最慢a[3]的一起過(時間為a[3]),最快a[1]的回來(時間為a[1]),和第二慢a[2]的人一起(時間為a[2])

總的時間為a[1]+a[2]+a[3]

四個人過:有兩種方法

1.第一快的和第四快(最慢)的過去,(時間為a[4]),第一快的回來(時間為a[1]),第一快的和第三快的過去(時間為a[3]),最快的回來(時間為a[1]),第一快的和第二快的過去(時間為a[2])

總的時間為a[4]+a[1]+a[3]+a[1]+a[2]   

a[1]*2+a[2]+a[3]+a[4]

a[1]*2+a[n]+a[n-1] .........

//第一快的和第四快(最慢)的過去,(時間為a[4]),第一快的回來(時間為a[1]),第一快的和第三快的過去(時間為a[3])

2第一快的和第二快的過去(時間為a[2]),第一快的回來(時間為a[1]),第三快的和第四快的過去(時間為a[4]),第二塊的回來(時間為a[2]),第一快的和第二快的過去(時間為a[2])

總的時間為a[2]+a[1]+a[4]+a[2]+a[2]  

a[1]+a[2]*2++a[n]     ......

//第一快的和第二快的過去(時間為a[2]),第一快的回來(時間為a[1]),第三快的和第四快的過去(時間為a[4]),第二塊的回來(時間為a[2]),

此題目同

#include#includeusing namespace std;

int a[1002];

bool com(int a,int b)

sort(a,a+n,com);

while(n)

else if (n == 2)

else if (n == 3)

else

else

n-=2;}}

cout< a[1] + 2 * a[2] + a[n])

else

n -= 2;// 每次過去過去兩個人,並且體現了方法}}

system.out.println(s);

} }}

貪心 陣列操作

對於一道貪心題,關鍵是要證明,如果資料範圍給好一點,估計很容易想到貪心 因為資料有點大,直接處理可能會tle 雖然有人直接處理也過了,但秉著探索科學的心,我們來想想正解 實際上我已經想過兩兩合併,但忽略了最長子段和跨越的情況 陣列操作 基礎題 最大子段和 考慮直接掃瞄的過程遇到小於0就重新賦值為0,...

貪心過河問題

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

貪心 過河問題

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