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