题解:P12234 [蓝桥杯 2023 国 Java A] 最大算式
yanmingqian · · 题解
看起来很像动态规划,动态规划或许也能做,但是实际上可以贪心。
正常人都知道通常来说乘是比加更优的。但是样例就能告诉我们并不完全是这样。因为
假设
但是前面说的
7
1 1 2 1 1 1 1
正确答案应该是
根据这个思路我们就能写出代码了。
#include<iostream>
using namespace std;
const int mod=1e9+7;
long long a[100010];
int main(){
int n,m=0;
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
if(x){
a[++m]=x; //把0排掉
}
}
int last=0;
for(int i=1;i<=m;i++){
if(a[i]==1){
if(!last){
if(i<m){ //边界
a[i+1]++;
}
}
else{
if(i<m){ //边界
if(a[last]<=a[i+1]||a[last]==2){ //加到更小的上面,注意判断2的情况
a[last]++;
}
else{
a[i+1]++;
}
}
else{
a[last]++;
}
}
}
else if(a[i]>1){
last=i;
}
}
long long ans=1;
for(int i=1;i<=m;i++){
ans=(ans*a[i])%mod;
}
cout<<ans;
return 0;
}
import java.util.Scanner;
public class Main {
private static final int mod = (int) 1e9 + 7;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
long[] a = new long[100010];
int m = 0;
for (int i = 1; i <= n; i++) {
int x = scanner.nextInt();
if (x != 0) {
a[++m] = x;
}
}
int last = 0;
for (int i = 1; i <= m; i++) {
if (a[i] == 1) {
if (last == 0) {
if (i < m) {
a[i + 1]++;
}
} else {
if (i < m) {
if (a[last] <= a[i + 1] || a[last] == 2) {
a[last]++;
} else {
a[i + 1]++;
}
} else {
a[last]++;
}
}
} else if (a[i] > 1) {
last = i;
}
}
long ans = 1;
for (int i = 1; i <= m; i++) {
ans = (ans * a[i]) % mod;
}
System.out.println(ans);
}
}