2019年第十届蓝桥杯C/C++ 省赛B组真题:后缀表达式(呕血打分析)

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;
}

运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yjg_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值