#include #include using namespace std;/*貪婪法:
1)當人數<3時:直接過
2)當人數=3時:假設為a,b,c.(公升序)
如果用最小的來送:c+a+b=c+b+a
如果大的一起過:c+b+b=c+2b.
所以這個時候用小的來送.
3)當人數=4時,a,b,c,d(公升序)
如果用最小的來送:d+a+c+a+b=d+c+b+2a
如果先讓最小的兩個過河,再讓其中乙個回來,
讓最大的兩個過河,再讓前一步過去留下的那個回來,
再讓最小的2個過河
也就是說小的兩個過去2次,再單獨回來一次.
2b+b+a+d=d+3b+a
當d+c+b+2a<=d+3b+a時,也就是c-2b+a<=0時,第一種方法過.
否則用另外一種辦法
4)當人數》4時,a,b,..,c,d(公升序)
過去,回來,過去,回來(船要回來),讓最大的2個過去.
很笨的時間是d+c+c+a=d+2c+a(所有時間都寫出來後會發現時最慢的)
如果讓最小的來送:d+a+c+a=d+c+2a
否則:b+b+a+d=d+2b+a
如果d+c+2a<=d+2b+a,也就是c-2b+a<=0時,第一種方法過
*/int main()
else if(n == 2)
else if(n == 3)
else if(n == 4)
else
}cout<} return 0;
}
貪心 POJ 1700 過河問題
題意 n個人過河,船每次只能坐兩個人,船載每個人過河的所需時間不同,過河時間以耗時間長的那個為實際耗時,如何得出最快的過河時間。思路 1 每次最快和那些慢的過去,然後讓最快一直來回,最後全部到對岸。2 還有一種情況,你先讓兩個快的人從a過去至b,然後挑乙個人回來至a,留下乙個快的在b。ok,回來以後...
POJ 1700 經典過河問題(貪心)
id 1700 n個人過河。船每次最多僅僅能坐兩個人。船載每乙個人過河的所需時間不同,問最快的過河時間。思路 當n 1,2,3時所須要的最小時間非常easy求得,如今由n 4,如果n個人單獨過河所須要的時間儲存在陣列t中,將陣列t按公升序排序,那麼 這時將單獨過河所須要時間最多的兩個旅行者送到對岸去...
POJ 1700 經典過河問題(貪心)
id 1700 n個人過河。船每次最多僅僅能坐兩個人。船載每乙個人過河的所需時間不同,問最快的過河時間。思路 當n 1,2,3時所須要的最小時間非常easy求得,如今由n 4,如果n個人單獨過河所須要的時間儲存在陣列t中,將陣列t按公升序排序,那麼 這時將單獨過河所須要時間最多的兩個旅行者送到對岸去...