给定一个double类型的数组arr,其中的元素可正、可负、可0,返回子数组累乘的最大乘积。例如,arr=[-2.5, 4, 0, 3, 0.5, 8, -1],子数组[3, 0.5, 8]累乘可以获得最大的乘积12,所以返回12
[要求]
时间复杂度为
,空间复杂度为
第一行一个整数N。表示数组长度。
接下来一行N个浮点数表示数组内的数
输出一个浮点数表示答案,保留到小数点后两位
7 -2.5 4 0 3 0.5 8 -1
12.00
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
double a[n], Max=1, Min=1, s=0;
for(int i=0;i<n;i++){
cin>>a[i];
double s1 = Max * a[i];
double s2 = Min * a[i];
Max = max(a[i], max(s1, s2));
Min = min(a[i], min(s1, s2));
s = max(s, Max);
}
printf("%.2f\n", s);
return 0;
} import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] strArr = br.readLine().split(" ");
double[] nums = new double[n];
for(int i = 0; i < n; i++) nums[i] = Double.parseDouble(strArr[i]);
double dmax = 1.0, dmin = 1.0;
double max = Double.MIN_VALUE;
for(int i = 0; i < n; i++){
if(nums[i] < 0){
// 遇到负数时,需要交换一下到目前为止的最大累乘值和最小累乘值,因为会使得最大的变最小,最小的变最大
double temp = dmax;
dmax = dmin;
dmin = temp;
}
dmax = Math.max(dmax * nums[i], nums[i]);
dmin = Math.min(dmin * nums[i], nums[i]);
max = Math.max(max, dmax);
}
System.out.println(String.format("%.2f", max));
}
} #include <bits/stdc++.h>
using namespace std;
int main(){
int n;
double num; scanf("%d%lf", &n,&num);
double maxX = num;
double minX = num;
double ans = num;
for(int i=1; i<n; i++){
scanf("%lf", &num);
double temp = maxX;
maxX = max(max(num*maxX, num*minX), num);
minX = min(min(num*temp, num*minX), num);
ans = max(ans, maxX);
}
printf("%.2f", ans);
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
double[] arr = new double[n];
for(int i=0;i<n;i++){
arr[i] = scanner.nextDouble();
}
double max = 1,min = 1,res = Integer.MIN_VALUE,p=0,q=0;
for(int i=0;i<n;i++) {
p = max * arr[i];
q = min * arr[i];
max = Math.max(Math.max(p, q), arr[i]);
min = Math.min(Math.min(p, q), arr[i]);
res = Math.max(res, max);
}
System.out.print(String.format("%.2f", res));
}
}
#include<iostream>
#include<vector>
#include<algorithm>
#include <iomanip>
using namespace std;
int main() {
int N;
vector<double> arrIn;
cin >> N;
for (int i = 0; i<N; i++) {
double temp;
cin >> temp;
arrIn.push_back(temp);
}
double res = arrIn[0];
double maxc = arrIn[0];
double minc = arrIn[0];
double premax = 0, premin = 0;
/*计算以i结尾子数组最大乘积
1,以arr[i-1]结尾的最大乘积premax*arr[i];
2,以arr[i-1]结尾的最小乘积premin*arr[i]; 两个负数相乘
3,本身arr[i]最大
*/
for (int i = 1; i < N; i++) {
premax = maxc*arrIn[i];
premin = minc*arrIn[i];
maxc = max(max(premax, premin), arrIn[i]);
minc = min(min(premax, premin), arrIn[i]);
res = max(res, maxc);
}
cout << fixed << setprecision(2) << res << endl;
return 0;
} #include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
vector<double>num(n);
for(int i=0;i<n;i++)
cin>>num[i];
double res=num[0],minn = num[0],maxx = num[0];
for(int i=1;i<n;i++)
{
double x = maxx;
maxx = max(num[i],max(minn*num[i], maxx*num[i]));
minn = min(num[i], min(minn*num[i], x*num[i]));
res = max(res, maxx);
}
cout<<fixed << setprecision(2) <<res<<endl;
return 0;
} # include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
vector<double> nums(n);
for(int i = 0; i < n; ++i) cin >> nums[i];
double ans = 0;
// 一个保存最大的,一个保存最小的。
double maxsum = 1;
double minsum = 1;
for(int i = 0; i < n; ++i){
// 如果遇到数组的数是负数,那么会导致最大的变最小的,最小的变最大的。因此交换两个的值
if(nums[i] < 0) swap(maxsum, minsum);
// 数组元素为正数的情况,最大乘积可能是乘上当前元素,也可能变成元素本身
// 取决于上一个元素为止的最大乘积是正数还是负数
maxsum = max(nums[i], maxsum * nums[i]);
// 维护一个最小乘积,在元素 < 0 时使用
minsum = min(nums[i], minsum * nums[i]);
ans = ans > maxsum ? ans : maxsum;
}
printf("%.2f\n", ans);
return 0;
} #include <iostream>
#include <vector>
#include <stack>
using namespace std;
int main() {
int n = 0;
cin >> n;
vector<double> arr(n, 0);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
if (n == 0) {
printf("%.2f", 0.00);
return 0;
}
double p1 = 0, p2 = 0, p3 = 0;
double maxValue = arr[0], minValue = arr[0], res = arr[0];
for (int i = 1; i < n; i++) {
// 可能值1: 过去的最大连续值 * 当前值
p1 = maxValue * arr[i];
// 可能值2: 过去的最小连续值 * 当前值
p2 = minValue * arr[i];
// 可能值3: 当前值
p3 = arr[i];
// 3个可能值取一个最大值
maxValue = max(max(p1, p2), p3);
minValue = min(min(p1, p2), p3);
res = max(maxValue, res);
}
printf("%.2f", res);
return 0;
} public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int t = cin.nextInt();
cin.nextLine();
String[] line = cin.nextLine().split(" ");
double[] nums = new double[t];
for (int i=0; i < t; i++) {
nums[i] = Double.parseDouble(line[i]);
}
double dp_min_i = nums[0];
double dp_max_i = nums[0];
double dp_min_ii = Double.MAX_VALUE;
double dp_max_ii = 0;
double ret = nums[0];
for (int i=1; i < t; i++) {
double tmp_1 = dp_min_i * nums[i];
double tmp_2 = dp_max_i * nums[i];
dp_min_ii = Math.min(tmp_1, Math.min(tmp_2, nums[i]));
dp_max_ii = Math.max(tmp_1, Math.max(tmp_2, nums[i]));
ret = Math.max(dp_max_ii, ret);
dp_min_i = dp_min_ii;
dp_max_i = dp_max_ii;
}
System.out.printf("%.2f\n", ret);
}
}
#include<iostream>
using namespace std;
const int N = 1e5+10;
double a[N];
inline double max(double a,double b ,double c) {
return max(a,max(b,c));
}
inline double min(double a,double b,double c) {
return min(a,min(b,c));
}
int main() {
int n;
cin>>n;
double res=0;
double t1=1,t2 = 1;
for(int i=0;i<n;++i) {
cin>>a[i];
}
for(int i=0;i<n;++i) {
double s1 = t1*a[i];
double s2 = t2*a[i];
t1 = max(a[i],s1,s2);
t2 = min(a[i],s1,s2);
res = max(res, t1);
}
printf("%.2lf" ,res);
}