P1018 noip2000提高組乘積最大
"P1018 乘積最大" 是 NOIP(全國青少年信息學奧林匹克競賽)2000 年提高組的一道題目。這道題目要求你找出一個數字序列中所有數字乘積的最大值。
題目描述如下:
給定一個包含 n 個正整數的數組 A,你需要找出 A 中的所有數乘積的最大值。
示例:
如果 A = [2, 3, 4],那麼 A 中所有數字乘積的最大值是 2 3 4 = 24。
解題思路:
要找出所有數字乘積的最大值,你可以使用以下算法:
- 初始化一個變量 max_product 來存放乘積的最大值。
- 初始化一個變量 current_product 來存放當前數字的乘積。
- 遍歷數組 A,對於每一個數字 ai,執行以下操作:
- 如果 current_product != 1,則將 current_product 乘以 ai,更新 max_product。
- 如果 current_product == 1 或者 current_product * ai < 0,則將 current_product 置為 ai 或者置為 1,並更新 max_product。
- 返回 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),因為我們需要遍歷整個數組,並且在每次疊代中存儲當前乘積。