1. 程式人生 > >【貪心】Crossing River

【貪心】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"); }