返回列表 發帖

202404潛力3-搭船渡河


搭船渡河 (Boat)
問題敘述
有N位體重分別為W1, W2, …, WN單位的遊客準備搭船渡河,船隻的最大載客數量為 M人,載重量為 L。請幫遊客們計算出最少需要幾趟船才能讓他們全部都渡河。假設我們不考慮船夫的重量、而且只有這N位遊客需要渡河。
例如:有N = 4位遊客體重分別為W1 = 80, W2 = 70, W3 = 75, W4 = 30單位,船隻的最大載客數量為M  = 2人,載重量為L = 100單位,則最少需要3趟船,編號1和3各需要一艘船、編號2和4可共乘一艘船。
輸入格式
第一列有三個正整數N, M, L ( M ≤ N ≤ 17, L ≤ 106 ),表示有N位遊客、船隻的最大載客數量為M人,載重量為L。第二列有N個正整數W1, W2, …, WN (W1, W2, …, WN ≤ L),兩個正整數之間以一個空白為間隔,表示遊客的體重。
輸出格式
請輸出一個非負整數,表示最少需要幾趟船。

評分說明
此題目測資分成三組,每組測資有多筆測試資料,需答對該組所有測試資料才能獲得該組分數,各組詳細限制如下。
第一組 (30 分):N ≤ 10。
第二組 (40 分):N ≤ 14。
第三組 (30 分):無特別限制。
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊
May

  1. //#include <iostream>
  2. //#include <vector>
  3. //#include <algorithm>
  4. #include <bits/stdc++.h>
  5. using namespace std;

  6. int minBoatTrips(int N, int M, int L, vector<int> weights) {

  7.     sort(weights.begin(), weights.end(), greater<int>());// 依降序排序

  8.     int trips = 0; // 計算行程
  9.     int i = 0, j = N - 1; // 兩個指針指向尚未分配行程的遊客: 最重 (i) and 最輕 (j)

  10.     while (i <= j) {
  11.         int currentWeight = weights[i];
  12.         int passengerCount = 1;//乘客數量

  13.         // 如果符合體重限制,請嘗試與最輕的人 (j) 配對
  14.         while (passengerCount < M  && currentWeight + weights[j] <= L) {  //不能用if
  15.             currentWeight += weights[j];
  16.             passengerCount++;//如果他們可以共用一艘船,就兩人都派,否則就只發送最重的那位
  17.             j--; // 在while迴圈中,更新最輕的遊客,看還能不能再多一個人
  18.         }

  19.         // 增加行程計數並移動最重遊客的指針

  20.         trips++;//發船
  21.         i++;//更新最重的遊客
  22.     }
  23.      return trips;
  24. }

  25. int main() {
  26.     int N, M, L;
  27.     cin >> N >> M >> L;

  28.     vector<int> weights(N);
  29.     for (int i = 0; i < N; i++) {
  30.         cin >> weights[i];
  31.     }

  32.     int result = minBoatTrips(N, M, L, weights);//呼叫minBoatTrips函數回報答案
  33.     cout << result << endl;

  34.     return 0;
  35. }
  36. /*
  37. 4 2 100
  38. 80 35 70 30

  39. 5 3 80
  40. 50 20 30 70 40

  41. */
複製代碼
May

TOP

返回列表