POJ 1700 經典過河問題(貪心)

2022-08-02 15:06:10 字數 895 閱讀 1050

id=1700

n個人過河。船每次最多僅僅能坐兩個人。船載每乙個人過河的所需時間不同,問最快的過河時間。

思路:當n=1,2,3時所須要的最小時間非常easy求得,如今由n>=4,如果n個人單獨過河所須要的時間儲存在陣列t中,將陣列t按公升序排序,那麼 這時將單獨過河所須要時間最多的兩個旅行者送到對岸去,有兩種方式:

1> 最快的(即所用時間t[0])和次快的過河,然後最快的將船划回來,再次慢的和最慢的過河,然後次快的將船划回來.

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

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

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

這樣就將過河所需時間最大的兩個人送過了河,而對於剩下的人,採用相同的處理方式,接下來做的就是推斷如何用的時間最少.

**例如以下:

#include#includeusing namespace std;

int main()

{ int m,n,t[1001],i,sum;

cin>>m;

while(m--)

{cin>>n;

sum=0;

for(i=0;i>t[i];

sort(t,t+n);

for(i=n-1;i>2;i-=2)

if(t[0]+2*t[1]+t[i]>2*t[0]+t[i-1]+t[i])

sum+=2*t[0]+t[i-1]+t[i];

else sum+=t[0]+2*t[1]+t[i];

if(i==2) sum+=t[0]+t[1]+t[2];

else if(i==1) sum+=t[1];

else sum+=t[0];

cout<

POJ 1700 經典過河問題(貪心)

id 1700 n個人過河。船每次最多僅僅能坐兩個人。船載每乙個人過河的所需時間不同,問最快的過河時間。思路 當n 1,2,3時所須要的最小時間非常easy求得,如今由n 4,如果n個人單獨過河所須要的時間儲存在陣列t中,將陣列t按公升序排序,那麼 這時將單獨過河所須要時間最多的兩個旅行者送到對岸去...

貪心 POJ 1700 過河問題

題意 n個人過河,船每次只能坐兩個人,船載每個人過河的所需時間不同,過河時間以耗時間長的那個為實際耗時,如何得出最快的過河時間。思路 1 每次最快和那些慢的過去,然後讓最快一直來回,最後全部到對岸。2 還有一種情況,你先讓兩個快的人從a過去至b,然後挑乙個人回來至a,留下乙個快的在b。ok,回來以後...

poj 1700 過河問題 貪心法

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 公升序 如果...