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

题目描述:
N个旅行者在夜里过桥需要借助手电筒。但N个人中只有一个手电筒,而且桥上只能让两个人过,每个人单独过桥所需时间已知,但如果两个人同时过桥则所需时间走的慢的那个人单独过桥所需的时间。
设计一个方案,让这N个人尽快过桥,计算这N个人的最短过桥时间。

比如:有甲乙丙丁四个人,他们过河所需的时间分别是1 2 5 10,让最快的两个人先过桥,然后让跑得最快的人回去接剩下的人。
先让甲乙过去(2分钟),甲回来(1分钟),甲丙过去(5分钟),甲回来(1分钟)甲丁再过去(10)分钟,共要十九分钟,这只是一个例子,19并非最短时间

案例:
输入:
4
1 2 5 10

输出:
17

include<bits/stdc++.h>

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;

}

posted @ 2025-07-03 09:23  暗神酱  阅读(19)  评论(0)    收藏  举报