P1018 noip2000提高組乘積最大

"P1018 乘積最大" 是 NOIP(全國青少年信息學奧林匹克競賽)2000 年提高組的一道題目。這道題目要求你找出一個數字序列中所有數字乘積的最大值。

題目描述如下:

給定一個包含 n 個正整數的數組 A,你需要找出 A 中的所有數乘積的最大值。

示例:

如果 A = [2, 3, 4],那麼 A 中所有數字乘積的最大值是 2 3 4 = 24。

解題思路:

要找出所有數字乘積的最大值,你可以使用以下算法:

  1. 初始化一個變量 max_product 來存放乘積的最大值。
  2. 初始化一個變量 current_product 來存放當前數字的乘積。
  3. 遍歷數組 A,對於每一個數字 ai,執行以下操作:
    • 如果 current_product != 1,則將 current_product 乘以 ai,更新 max_product。
    • 如果 current_product == 1 或者 current_product * ai < 0,則將 current_product 置為 ai 或者置為 1,並更新 max_product。
  4. 返回 max_product。

以下是一個可能的 C++ 實現:

#include <iostream>
#include <vector>

using namespace std;

int max_product(const vector<int>& A) {
    int max_product = 1;
    int current_product = 1;

    for (int a : A) {
        if (current_product != 1) {
            current_product *= a;
            max_product = max(max_product, current_product);
        } else if (current_product == 1 || a < 0) {
            current_product = a > 0 ? a : 1;
            max_product = max(max_product, current_product);
        }
    }

    return max_product;
}

int main() {
    vector<int> A;
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        int a;
        cin >> a;
        A.push_back(a);
    }

    cout << max_product(A) << endl;

    return 0;
}

這個算法的時間複雜度是 O(n),空間複雜度也是 O(n),因為我們需要遍歷整個數組,並且在每次疊代中存儲當前乘積。