【貪心】Crossing River
阿新 • • 發佈:2019-01-02
題目描述
思路
想了半天不知道該如何用貪心解決,大概能夠意識到回程中用速度快的人會使得總時間較小,但是其餘部分不知如何處理。
看了他人解題報告後,意識到應該每次把最慢的兩個運到對岸,同時要保證每輪結束後最快的兩個人在岸原來那邊。
程式碼
// 貪心
// 思路:每次把最慢的兩個運到對岸,同時要保證本輪結束後最快的兩個在岸原來那邊
#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");
}