题目描述
给定 NN 个加号、 MM 个减号以及 N+M+1N+M+1 个整数 A_1,A_2,\cdots,A_{N+M+1}A1,A2,⋯,AN+M+1,小明想知道在所有由这 NN 个加号、 MM 个减号以及 N+M+1N+M+1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个。
请你输出这个最大的结果。
例如使用 1 2 3 + -
,则 2 3 + 1 -
这个后缀表达式结果是 44,是最大的。
输入格式
第一行包含两个整数 NN 和 MM。
第二行包含 N+M+1N+M+1 个整数 A_1,A_2,\cdots,A_{N+M+1}A1,A2,⋯,AN+M+1。
输出格式
输出一个整数,代表答案。
输入输出样例
输入 #1复制
1 1 1 2 3
输出 #1复制
4
说明/提示
对于所有评测用例,0 \le N,M \le 10^50≤N,M≤105,-10^9 \le A_i \le 10^9−109≤Ai≤109。
蓝桥杯 2019 年省赛 B 组 I 题。
C++写法
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=2e5+2;
ll n,m,len,sub;
ll a[MAXN],ans;
int main(){
cin.tie(0),cout.tie(0);
ios::sync_with_stdio(false);
cin>>n>>m;
len=n+m+1;
for(ll i=0;i<len;i++){
cin>>a[i];
if(a[i]<0)sub++;
}
if(m==0){
for(ll i=0;i<len;i++)
ans+=a[i];
cout<<ans;
return 0;
}
if(sub==0){//没有负数,即全是正数
sort(a,a+len);
for(ll i=len-1;i>0;i--)
ans+=a[i];
ans-=a[0];
cout<<ans;
return 0;
}else{//有负数
if(sub==len){//全是负数
for(ll i=0;i<len;i++)
a[i]= abs(a[i]);
sort(a,a+len);
for(ll i=len-1;i>0;i--)
ans+=a[i];
ans-=a[0];
cout<<ans;
return 0;
}else{//不全是负数
for(ll i=0;i<len;i++)
ans+= abs(a[i]);
cout<<ans;
return 0;
}
}
return 0;
}
C语言写法
#include<stdio.h>
int main()
{
int m,n,i,min=0,max=0;
int a[300000];
scanf("%d",&m);
getchar();
scanf("%d",&n);
for(i=0;i<n+m+1;i++)
{
getchar();
scanf("%d",&a[i]);
}
if(n!=0)
{
min=a[0];
max=a[0];
for(i=0;i<m+n+1;i++)
{
if(a[i]<min)
min=a[i];
if(a[i]>max)
max=a[i];
if(a[i]<0)
{
a[i]=-a[i];
}
}
}
long ans=0;
for(i=0;i<n+m+1;i++)
{
ans+=a[i];
}
if(min>0)
ans-=2*min;
if(max<0)
ans+=2*max;
printf("%ld",ans);
}
分析:这道题的关键是理解什么是后缀表达式。
运用后缀表达式进行计算的具体做法:
建立一个栈S 。从左到右读表达式,如果读到操作数就将它压入栈S中,如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项按操作符运算,再将运算的结果代替原栈顶的n项,压入栈S中 。如果后缀表达式未读完,则重复上面过程,最后输出栈顶的数值则为结束。
例 : 6 5 2 3 + 8 * + 3 + *
先将前面的数字入栈
栈 :6 5 2 3
遇到 ” + ” 取栈顶的两个操作数做加法, 2 + 3 = 5 , 入栈
栈 :6 5 5
遇到 ” 8 ” 入栈
栈 :6 5 5 8
遇到 ” * ” 取栈顶的两个操作数做乘法, 5 * 8 = 40 , 入栈
栈 :6 5 40
遇到 ” + ” 取栈顶的两个操作数做加法, 5 + 40 = 45 , 入栈
栈 :6 45
遇到 ” 3 ” 入栈
栈 :6 45 3
遇到 ” + ” 取栈顶的两个操作数做加法, 45 + 3 = 48 , 入栈
栈 :6 48
遇到 ” * ” 取栈顶的两个操作数做加法, 6 * 48 = 288 , 入栈
栈 :288
附上链接
原文链接:https://blog.csdn.net/u012507347/article/details/52245233