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