貪心 過河問題

2021-09-22 20:02:09 字數 2535 閱讀 7471

我是題目鏈結

47-過河問題

記憶體限制:64mb 時間限制:1000ms 特判: no

難度:5

題目描述:

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

輸入描述:

第一行是乙個整數t(1<=t<=20)表示測試資料的組數

每組測試資料的第一行是乙個整數n(1<=n<=1000)表示共有n個人要過河

每組測試資料的第二行是n個整數si,表示此人過河所需要花時間。(0解題思路:

當n=1或者n=2時:所有人直接過河即可。當n=3時的乙個人一起過去。當n=4時:假設time[0]為用時最短的人所用的時間,time[1]為用時第二短的人所用的時間, time[n-1]為用時最長的人所用的時間,

time[n-2]為用時第二長的人所用的時間。則有兩種過河方式:

2time[0]+time[n-1]+time[n-2]表示:用時最長的人和用時最短的人先一起過去,然後用時最短的人把手電筒帶回來,再和用時第二長的人一起過去,用時最短的人回來。

2time[1]+time[0]+time[n-1]表示:用時最短和用時第二短的人一起過去,然後用時最短的人把手電筒帶回來,然後用時最長和用時第二長的人一起過去,用時第二短的人回來。

比較兩種過河方式:2time[0]+time[n-1]+time[n-2]<2time[1]+time[0]+time[n-1]

#include < cstdio>

#include< algorithm>

using namespace std;

int mintime(int n,int * a)

if(n=0)

//當n=1或者n=2時:所有人直接過河即可。當n=3時:用時最長和用時最短的人先一起過去,然後用時最短的人回來,再在和剩下的乙個人一起過去。當n=4時:假設time[0]為用時最短的人所用的時間,time[1]為用時第二短的人所用的時間, time[n-1]為用時最長的人所用的時間,

res+=a[0];

else if(n==1)

res+=a[1];

else

res+=a[0]+a[1]+a[2];

return res;

}這樣相當於每次都過去了兩個人,所以n-=2,

再對剩下的n-2個人執行相同的操作,直至不足4人即可。

貪心策略

問題分析:

我們對用時進行排序。

首先根據他給的示例,看如何才能得到最小的用時17。1、2→2,表示1和2同時過橋,用時為2:

1、2→2

1←15、10→10

2←21、2→2

綜上2+1+10+2+2=17

從中我們可以看出首先令用時最小的兩個人過橋,然後用時最小的回來,其次讓用時最多的兩個人過橋,然後讓次小的人回來,從中我們可以整理出乙個迴圈:

最小、次小→次小

最小←最小

最大、次大→最大

次小←次小

通過上面這個迴圈我們不斷讓用時最大和次大的人過橋。

通過以上分析我們編寫了**,根據我的個人測試的幾組資料都是成功的。但是,當提交**時結果是錯誤的。

經過一系列的分析,我找到了乙個以上迴圈的錯誤特例,如2、4、5、7,如果根據上面的迴圈,過橋順序如下:

2、4→4

2←25、7→7

4←42、4→4

過橋用時為4+2+7+4+4=21.但是存在更短的過橋時間如下:

2、7→7

2←22、5→5

2←22、4→4

過橋用時為7+2+5+2+4=20.

二者的區別是什麼呢?

前者在運送最高和次高用時的人採取的是先讓兩個最小用時的人過橋來回策應。而後者的策略是讓最小用時的人單獨護送最高用時的兩個人過橋。後者的過橋迴圈如下:

最小、最大→最大

最小←最小

最小、次大→次大

最小←最小

所以在運送最大和次大用時的人過橋時需要作出判斷,是採用策略1還是採用策略2。我們來計算一下策略1和策略2的用時,選擇用時較小的來運送最大和次大用時的人過橋。

分析:每一輪讓最快的兩個人先過橋,最快的乙個人拿手電回來,然後這邊最慢的兩人先過去,橋那邊最快的乙個人回來類推

最後附上ac**:

#include#includeusing namespace std;

int fun(int n,int *a)

if(n==0)

sum+=a[0];

else if(n==1)

sum+=a[1];

else

sum+=a[0]+a[1]+a[2];

return sum;

}int main()

return 0;

}

貪心過河問題

過河問題 時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 ...

貪心 過河問題

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...

貪心 過河問題

題目意思 每個人過河都有自己的過河時間,有n個人想過河,但只有乙隻小船,最多只能裝2個人,每一次過河,過河時間為用時最多的那人過河時間,如果還有人沒有過河,那麼過去乙個用時最少 的送回船。問n人過河最少要多少時間。分析 參考網上的思路 題意 也就是乙個坐船問題,一共有兩個策略 最快和次快過去,最快回...