過河問題(ACM

2021-07-10 04:45:56 字數 2280 閱讀 6025

描述

在漆黑的夜裡,n

位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,

n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,

n人所需要的時間已知;而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題是,如何設計乙個方案,讓這

n人盡快過橋。輸入

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

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

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

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

樣例輸入 1

41 2 5 10

樣例輸出 17

問題分析:

我們對用時進行排序。

首先根據他給的示例,看如何才能得到最小的用時17。1

、2→2

,表示1和2

同時過橋,用時為2:

1、2→21←1

5、10→10

2←21、

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

最小、次小→次小

最小←最小

最大、次大→最大

次小←次小

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

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

經過一系列的分析,我找到了乙個以上迴圈的錯誤特例,如2、4

、5、7

,如果根據上面的迴圈,過橋順序如下: 2、

4→42←2

5、7→7

4←42、

4→4過橋用時為4+2+7+4+4=21.

但是存在更短的過橋時間如下: 2、

7→72←2

2、5→5

2←22、

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

二者的區別是什麼呢?

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

最小、最大→最大

最小←最小

最小、次大→次大

最小←最小

所以在運送最大和次大用時的人過橋時需要作出判斷,是採用策略1還

是採用策略

2。我們來計算一下策略

1和策略

2的用時,選擇用時較小的來運送最大和次大用時的人過橋。

**如下:

#include

#include

#include

using

namespace std;

int main()

int n;

//輸入測試組數

cin >> n;

vector

> v(n);

for (int i = 0; i < n; ++i)

int len;

cin >> len;

for (int j = 0; j < len; ++j)

int time;

cin >> time;

v[i].push_back(time);

for (int i = 0; i < n; ++i)

sort(v[i].begin(), v[i].end());

int all_time = 0;

vector

::size_type j = v[i].size() - 1;

//如果只有乙個人直接輸出過橋時間,進入下次迴圈

if (j == 0)

cout << v[i][0] << endl;

continue;

for (; j>1; j = j - 2)

if (j == 2)

//如果最後剩餘三個人則直接進行用時處理

all_time += v[i][0] + v[i][1] + v[i][2];

continue;

if (v[i][0] + v[i][1] * 2 < 2 * v[i][0] + v[i][j - 1])

all_time += v[i][0] + v[i][1] * 2 + v[i][j];

else

all_time += 2 * v[i][0] + v[i][j - 1] + v[i][j];

if (j==1)

all_time += v[i][1];

cout << all_time << endl;

ACM 過河問題

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

青蛙過河問題

青蛙過河是乙個非常有趣的智力遊戲,其大意如下 一條河之間有若干個石塊間隔,有兩隊青蛙在過河,每隊有3 只青蛙,如 圖 10 19所示。這些 青蛙只能向前移動,不能向後移動,且一次只能有乙隻青蛙向前移動。在移動過程中,育蛙可以向 前面的空位中移動,不可一次跳過兩個位置,但是可以跳過對方乙隻青蛙進入前面...

貪心過河問題

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