题目内容
塔子哥有一个长度为 n n n 的数组 a a a ,默认的求和方式是将 a a a 中所有元素加起来。
但是塔子哥有一种技能,可以将求和的其中一次加法转换为乘法操作。
在这种情况下,数组 a a a 的最大和为多少。
输入描述
第一行,一个正整数 n ( 1 ≤ n ≤ 1 0 5 ) n(1\leq n\leq 10^5) n(1≤n≤105) ,表示数组 a a a 的大小
第二行, n n n 个正整数 a i ( 1 ≤ a i ≤ 1 0 9 ) a_i(1\leq a_i\leq 10^9) ai(1≤ai≤109)
输出描述
一个整数,表示最大和。
样例
输入
3
1 2 3
输出
7
说明
1 + 2 + 3 = 6 , 1 × 2 + 3 = 5 , 1 + 2 × 3 = 7 1+2+3=6, 1\times 2+3=5, 1+2\times 3=7 1+2+3=6,1×2+3=5,1+2×3=7
所以最大和为 7 7 7
思路:枚举
按照题意进行操作,只能选择将一个加号变为乘号,枚举将每个加号变为乘号,然后取最大值即可。
这里可以先求出来所有数的和,然后减去要进行乘法的两个数的和,再加上其乘积即可。
时间复杂度: O ( n ) O(n) O(n)
代码
C++
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<long long> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
long long s = accumulate(a.begin(), a.end(), 0ll);
long long ans = s;
for (int i = 0; i < n - 1; i++) {
ans = max(ans, s - a[i] - a[i + 1] + a[i] * a[i + 1]);
}
cout << ans << "\n";
return 0;
}
python
n = int(input())
a = list(map(int, input().split()))
s = sum(a)
ans = s
for i in range(n-1):
ans = max(ans, s - a[i] - a[i + 1] + a[i] * a[i + 1])
print(ans)
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
long[] a = new long[n];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextLong();
}
long s = 0;
for (long num : a) {
s += num;
}
long ans = s;
for (int i = 0; i < n - 1; i++) {
ans = Math.max(ans, s - a[i] - a[i + 1] + a[i] * a[i + 1]);
}
System.out.println(ans);
}
}