题目描述
题目链接:Crossing River。
思路
想了半天不知道该如何用贪心解决,大概能够意识到回程中用速度快的人会使得总时间较小,但是其余部分不知如何处理。
看了他人解题报告后,意识到应该每次把最慢的两个运到对岸,同时要保证每轮结束后最快的两个人在岸原来那边。
代码
// 贪心
// 思路:每次把最慢的两个运到对岸,同时要保证本轮结束后最快的两个在岸原来那边
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int caseNum, n, time;
int speed[1001];
cin >> caseNum;
while (caseNum--) {
cin >> n;
time = 0;
for (int i = 0; i < n; ++i)
cin >> speed[i];
sort(speed, speed + n);
while (n > 3) {
int t1 = speed[0] + speed[1] * 2 + speed[n - 1]; // 最快和次快过去,最快回;最慢和次慢过去,次快回
int t2 = speed[0] * 2 + speed[n - 1] + speed[n - 2]; // 最快和最慢过去,最快回;最快和次快过去,最快回
time = t1 < t2 ? time + t1 : time + t2;
n -= 2;
}
if (n <= 2)
time += speed[n - 1];
if (n == 3)
time += speed[0] + speed[1] + speed[2];
cout << time << endl;
}
system("pause");
}