返回列表 發帖

資料結構 502 失落的數字寶藏

資料結構 502 失落的數字寶藏
1. 題目說明:
請依下列題意進行作答,使輸出值符合題意要求。

2. 設計說明:
(1) 在一個古老的數字世界中,有一個傳說,講述著一個隱藏的數字寶藏,它包含了一系列的數字,而寶藏就隱藏在序列中「數字和最大」的連續子序列中。

(2) 傳說中有一位勇敢的探險者,他決心要找到這個隱藏的數字寶藏。但是,他面對的挑戰是這個數字序列非常長,包含了正整數、負整數或 0。探險者需要一個特殊的工具來快速找到這個最有價值的子序列。

(3) 你的任務是幫助這位探險者,設計程式接收一個包含多個整數的序列,然後找出這個序列中具有最大數字和的連續子序列。找到這個子序列就等於找到了傳說中的數字寶藏。

3. 輸入輸出:
輸入說明
一個包含多個整數的序列,整數間以半形空白間隔。

輸出說明
第 1 列:最大連續子序列的總和。
第 2 列:最大連續子序列和的起始位置(以陣列 0 開始)。
第 3 列:最大連續子序列和的結束位置(以陣列 0 開始)。

範例輸入1
-4 1 2 9 -5
範例輸出1
12
1
3
範例輸入2
-3 4 7 -1 10 0 -2 -8 8 1 -3 0 7 -8 1 9 3 -4 10 -2
範例輸出2
34
1
18
May

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

  6. void findMaxSubarray(const vector<int>& nums) {
  7.     int max_sum = nums[0], current_sum = nums[0];
  8.     int start = 0, end = 0, temp_start = 0;

  9.     for (int i = 1; i < nums.size(); i++) {
  10.         if (current_sum < 0) {  // 若之前的和小於 0,重新計算
  11.             current_sum = nums[i];
  12.             temp_start = i;  // 可能的新起點
  13.         } else {
  14.             current_sum += nums[i];  // 累加當前數值
  15.         }

  16.         if (current_sum > max_sum) {  // 更新最大值
  17.             max_sum = current_sum;
  18.             start = temp_start;
  19.             end = i;
  20.         }
  21.     }

  22.     cout << max_sum << endl;
  23.     cout << start << endl;
  24.     cout << end << endl;
  25. }

  26. int main() {
  27.     string input;
  28.     getline(cin, input);
  29.     stringstream ss(input);
  30.     vector<int> nums;
  31.     int num;

  32.     while (ss >> num) {
  33.         nums.push_back(num);
  34.     }

  35.     if (nums.empty()) return 0;

  36.     findMaxSubarray(nums);
  37.     return 0;
  38. }
複製代碼
------------------------------------------------------
程式解釋
讀取輸入:使用 getline(cin, input) 讀取一整行數字,並用 stringstream 解析成 vector<int>。

Kadane's Algorithm 來找出最大連續子陣列和:

current_sum 記錄目前子陣列的和,若 current_sum 變成負數,則從當前數字重新計算。

max_sum 記錄最大和,並更新 start 和 end 位置。

輸出結果:

第 1 行:最大連續子陣列總和。

第 2 行:最大連續子陣列起始索引(0-based)。

第 3 行:最大連續子陣列結束索引(0-based)。
-------------------------------------------------------------
測資
測試 00:基本測試
輸入0
-4 1 2 9 -5
輸出
12
1
3
測試01:全為負數
輸入
-5 -2 -8 -1 -7
輸出
-1
3
3
說明:最大連續子陣列為 -1(單獨的一個數),位置為索引 3。

測試 02:全為正數
輸入
3 5 7 2 8 10
輸出
35
0
5
說明:所有數字都是正數,因此最大子序列就是整個數列。

測試03:含有 0
輸入
-3 4 0 5 -2 6 -8 9 0 3 -1
輸出
12
1
5
說明:最大連續子序列為 4 0 5 -2 6,總和 12。

測試04:長度較大的測試
輸入
1 -2 3 10 -4 7 2 -5 8 -1 6 -3 5 9 -6 4 -7 8 0 -2
輸出
21
2
12
說明:最大連續子序列為 3 10 -4 7 2 -5 8 -1 6,總和 21。

這些測試資料涵蓋:

正數、負數、混合數列

含 0 的情境

不同長度的數列

這樣就能確保你的程式能正確運作!
May

TOP

返回列表