小船過河問題

2021-09-30 14:23:32 字數 1231 閱讀 5506

/*

小船過河問題

poj1700是一道經典的貪心演算法例題。題目大意是只有一艘船,能乘2人,船的執行

速度為2人中較慢一人的速度,過去後還需乙個人把船划回來,問把n個人運到對岸,

最少需要多久。先將所有人過河所需的時間按照公升序排序,我們考慮把單獨過河所需

要時間最多的兩個旅行者送到對岸去,有兩種方式:

1.最快的和次快的過河,然後最快的將船划回來;次慢的和最慢的過河,然後次快的將船划回來,

所需時間為:t[0]+2*t[1]+t[n-1];

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

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

算一下就知道,除此之外的其它情況用的時間一定更多。每次都運送耗時最長的兩人而不影響其它人,

問題具有貪心子結構的性質。

*///核心是每次把排在最後的兩個人運到河對岸//

//之所以運後兩個人目的

//1.不用考慮前面陣列中元素的改變,這裡情況相當簡單了。。兩遭一共要四個單程

//2.這樣確實能做到用時最短。排在最後的兩個時間只取其一(相當於遮蔽了次長的時間),剩下運輸的讓用時最短的補齊

//否則的話,不能遮蔽 一趟長時間的運輸

//兩種運輸情況選擇用時最少的一種//

//這裡的問題之所以簡單,不用考慮陣列元素的變化,若每次運輸三個人的話,問題就複雜了。

//因為第三快的人將會在每次的運輸中被踢出,這樣陣列在每次運輸後都會改變。

#include #include using namespace std;

bool cmp(int const &x, int const &y)

int main()

;//每個人過河的速度

int sum = 0;

sort(spendtime, spendtime + 8, cmp);

while (n>3)

if (n == 3) sum += spendtime[0] + spendtime[1] + spendtime[2];

else if (n == 2)sum += spendtime[1];

else sum += spendtime[0];

cout << "一共用時:" << sum << endl;

system("pause");

return 0;

}

貪心之小船過河問題

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

貪心演算法 小船過河問題

description 一群人划船過河,河邊只有一條船,這條船可以容納兩個人,船過河後需要一人將船開回,以便所有人都可以過河,每個人過河速度不一樣,兩個人過河速度取決於慢的那個人,請問最少需要多久讓所有人過河?input 第一行輸入人數n 第二行輸入每個人過河所需的時間 output 輸出需要的最少...

小船過河(貪心演算法)

只有一艘船,最多能乘2人,船的執行速度為2人中較慢一人的速度,過去後還需乙個人把船划回來,問把n個人運到對岸,最少需要多久。輸入 4 1 2 5 10 輸出 17 1.因為考慮到需要乙個人把船划回來,所以我們可以用速度最快的人把其他人帶到對岸。a b c d ac a ad a 運輸成本 2a c ...