2019年第十届蓝桥杯C/C++ 省赛B组真题:后缀表达式
## 【问题描述】
给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1, A2, · · · , AN+M+1,小
明想知道在所有由这 N 个加号、M 个减号以及 N + M + 1 个整数凑出的合法的
后缀表达式中,结果最大的是哪一个?
请你输出这个最大的结果。
例如使用1 2 3 + -,则 “2 3 + 1 -” 这个后缀表达式结果是 4,是最大的。
【输入格式】
第一行包含两个整数 N 和 M。
1 1
第二行包含 N + M + 1 个整数 A1, A2, · · · , AN+M+1。
1 2 3
【输出格式】
输出一个整数,代表答案。
4
分析:
分两种情况:
第一种:没有负号的情况,直接所有相加就可以了。
第二种情况:有加号有负号,无论你怎么输入,我们都可以拿最大值减去最小值然后加上剩下数的绝对值即可,为什么呢?负负得正是关键点,比如:我们输入了:
2 2 两个加号,三个减号
输入了
4 -9 5 6 -1 五个数字,
当我们去用最大值减最小值时,6-(-9)时,那么其他的数字呢,我们可以这样,把负数拿入括号中,正数放在括号外面,6-(-9-1)+5+4,这样我们的值就是一直向上的,打开括号就是用了两个加号两个减号,其他的也一样。
废话不多说。
可以看b站大佬视频:天霸赤赤g
附上代码:
#include<iostream>
#include<algorithm>
using namespace std;
long long a[200010];
int main()
{
long long sum = 0;
int n, m;
cin >> n >> m;//n代表加号,m代表减号
for (int i = 0; i < n + m + 1; i++)
{
cin >> a[i];
}
//当没有减号的时候直接相加
if (m == 0)
{
for (int i = 0; i < n + m + 1; i++)
{
sum += a[i];
}
}
//其他情况:max-min+|其他数字|
else
{ sort(a, a + n + m + 1);
sum = a[n + m] - a[0];//最大减去最小
for (int i = 1; i < n + m; i++)
sum += abs(a[i]);//加上其他数字的绝对值
}
cout << sum << endl;
return 0;
}