nyoj 47 過河問題 貪心

2022-10-11 07:39:15 字數 1095 閱讀 3392

時間限制:1000 ms  |  記憶體限制:65535 kb

難度:5

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

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

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

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

輸出所有人都過河需要用的最少時間

樣例輸入

1

41 2 5 10

樣例輸出

17

解題思路:

/*

先把時間排序。

其實每次過橋留在對面的是a[n-1]和a[n-2]。其他人過去只是個媒介.

兩種方式可以每次過去兩個人:每次讓n-=2。

方法1:a[0]和a[1]過去,a[0]回來。a[n-1]和a[n-2]過去,a[1]回來。

方法2:a[0]和a[n-1]過去,a[0]回來。a[0]和a[n-2]過去,a[0]回來。

對方法1和方法2進行貪心。

如果n是大於3的奇數,經過幾個來回過橋。則最後剩3個人。只需方法1和方法2去掉最後

那個回來的步驟就可以保證過去三個人。

如果n是大於3的偶數,經過幾個來回過橋。則最後剩2個人。只需要加上a[1]即可。

所以可以初始化sum=a[1]。最後只需對於剩3人的進行操作即可。

*/

#includeusing namespace std;

#define min(a,b) ((a)<(b)?(a):(b))

int a[1010];

int main()

if(n==3)

printf("%d\n",sum+a[0]+a[2]);

else printf("%d\n",sum);

}return 0;

}

NYOJ47 過河問題(貪心)

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

NYOJ 47 過河問題 (貪心)

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

nyoj47過河問題(貪心)

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