返回列表 發帖

資料結構 201 任務報酬處理(中)

資料結構 201 任務報酬處理
1. 題目說明:
請依下列題意進行作答,使輸出值符合題意要求。

2. 設計說明:
(1) 冒險者每天能處理任務的時間有限,一天之中分成「早、中、晚」三個時段可以處理,每個時段可處理的任務數量及報酬金加成資訊如下:

早:最多可處理 3 個任務,且報酬金 x 3。
中:最多可處理 2 個任務,且報酬金 x 2。
晚:只能處理 1 個任務,報酬金無加成。
(2) 若任務數量超過一天能處理的量,則會順延到隔天,直到所有任務處理完為止。

(3) 請讓使用者輸入一個正整數佇列,代表公會給他的任務清單,先收到的任務先處理。
例如:「100,200,500」,每個數字代表任每項務報酬金,數字之間用半形逗號(,)隔開,若輸入 n 個數字代表總共有 n 個任務。

(4) 請使用佇列(Queue)的方式,為冒險者排程並完成所有任務,最後輸出他完成所有任務後,賺取的總報酬金。

3. 輸入輸出:
輸入說明
一個以半形逗號間隔的正整數佇列,代表任務清單。

輸出說明
完成所有任務後,得到的總報酬金。

若輸入的佇列中包含非正整數的值,則直接輸出「error」。

範例輸入1
100,200,500
範例輸出1
2400
範例輸入2
500,400,300,200,100
範例輸出2
4200
May

  1. //#include <iostream>
  2. //#include <queue>
  3. //#include <sstream>
  4. //#include <cctype>
  5. #include <bits/stdc++.h>
  6. using namespace std;

  7. // 檢查是否為正整數
  8. bool isPositiveInteger(const string &s) {
  9.     if (s.empty()) return false;
  10.     for (char c : s) {
  11.         if (!isdigit(c)) return false;
  12.     }
  13.     return true;
  14. }

  15. int main() {
  16.     string input;
  17.     getline(cin, input); // 讀取整行輸入
  18.    
  19.     queue<int> tasks; // 使用佇列來存任務
  20.     stringstream ss(input);
  21.     string token;

  22.     // 解析輸入
  23.     while (getline(ss, token, ',')) {
  24.         if (!isPositiveInteger(token)) { // 若有非正整數則輸出 error
  25.             cout << "error" << endl;
  26.             return 0;
  27.         }
  28.         tasks.push(stoi(token)); // 轉換為整數後加入佇列
  29.     }

  30.     long long totalReward = 0; // 儲存總報酬金

  31.     // 開始處理任務
  32.     while (!tasks.empty()) {
  33.         // 早上處理最多 3 個,報酬 * 3
  34.         for (int i = 0; i < 3 && !tasks.empty(); i++) {
  35.             totalReward += tasks.front() * 3;
  36.             tasks.pop();
  37.         }

  38.         // 中午處理最多 2 個,報酬 * 2
  39.         for (int i = 0; i < 2 && !tasks.empty(); i++) {
  40.             totalReward += tasks.front() * 2;
  41.             tasks.pop();
  42.         }

  43.         // 晚上處理最多 1 個,報酬不加成
  44.         if (!tasks.empty()) {
  45.             totalReward += tasks.front();
  46.             tasks.pop();
  47.         }
  48.     }

  49.     // 輸出最終總報酬金
  50.     cout << totalReward << endl;
  51.     return 0;
  52. }
複製代碼
回復 1# may
---------------------------------------------------------------
程式說明
1. 解析輸入
透過 getline(cin, input) 讀取使用者輸入。

使用 stringstream 將輸入按照 , 分割,並逐一檢查是否為正整數。

若有非正整數,直接輸出 "error" 並結束程式。

2. 佇列處理任務
建立 queue<int> tasks 來存放任務。

每天按照早、中、晚的時段來取出任務並計算報酬:

早:最多 3 個,報酬 x3。

中:最多 2 個,報酬 x2。

晚:最多 1 個,無加成。

3. 計算報酬
每取出一個任務,就依照對應時段的加成方式來累加總報酬。
---------------------------------------------------------------
測資
測資00:基本測試
輸入
100,200,500
預期輸出
2400
說明
早上處理 100、200、500(*3)。

總報酬 = 100×3 + 200×3 + 500×3 = 2400。

測資 01:多天處理
輸入
500,400,300,200,100
預期輸出
4200
說明
第一天:早上 500、400、300(*3),中午 200、100(*2)。

總報酬 = 500×3 + 400×3 + 300×3 + 200×2 + 100×2 = 4200。

測資 02:剛好 6 個任務
輸入
50,60,70,80,90,100
預期輸出
1020
說明
第一天:早上 50、60、70(*3),中午 80、90(*2),晚上 100(*1)。

總報酬 = 50×3 + 60×3 + 70×3 + 80×2 + 90×2 + 100×1 = 1020。

測資03:大量任務
輸入
10,20,30,40,50,60,70,80,90,100,110,120
預期輸出
2790
說明
第一天:早上 10、20、30(*3),中午 40、50(*2),晚上 60(*1)。

第二天:早上 70、80、90(*3),中午 100、110(*2),晚上 120(*1)。

總報酬 = 2790。

測資 04:異常輸入
輸入
500,abc,300
預期輸出
error
說明
因為 "abc" 不是正整數,應該直接輸出 "error"。
May

TOP

返回列表