贪心算法的又一个典型案例:过桥问题

贪心算法的又一个典型案例:过桥问题

题目描述:

N个旅行者在夜里过桥需要借助手电筒。但N个人中只有一个手电筒,而且桥上只能让两个人过,每个人单独过桥所需时间已知,但如果两个人同时过桥则所需时间走的慢的那个人单独过桥所需的时间。

设计一个方案,让这N个人尽快过桥,计算这N个人的最短过桥时间。

比如:有甲乙丙丁四个人,他们过河所需的时间分别是1 2 5 10,让最快的两个人先过桥,然后让跑得最快的人回去接剩下的人。

先让甲乙过去(2分钟),甲回来(1分钟),甲丙过去(5分钟),甲回来(1分钟)甲丁再过去(10)分钟,共要十九分钟,这只是一个例子,19并非最短时间

案例:

输入:

4

1 2 5 10

输出:

17

include

using namespace std;

int main()

{

int n;

cin >> n;

vector time(n);

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

cin >> time[i];

}

sort(time.begin(), time.end());

int sum = 0;

while (n > 3) {

// 策略1:最快的人来回送最慢的两人

int option1 = time[0] * 2 + time[n-1] + time[n-2];

// 策略2:最快的和次快的先过,最快的回来,最慢的和次慢的过,次快的回来

int option2 = time[0] + time[1] * 2 + time[n-1];

sum += min(option1, option2);

n -= 2;

}

// 处理剩余的人

if (n == 3) {

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

} else if (n == 2) {

sum += time[1];

} else if (n == 1) {

sum += time[0];

}

cout << sum << endl;

return 0;

}

相关推荐

Maya为模型添加细分数
BT365账户验证需要多久

Maya为模型添加细分数

09-29 👁️ 998
Facebook全球覆盖国家使用情况解析
365bet电脑版

Facebook全球覆盖国家使用情况解析

08-22 👁️ 3247
手机黑屏无法开机?试试这些方法
365体育手机版中国官方网站

手机黑屏无法开机?试试这些方法

07-11 👁️ 5161