第十届蓝桥杯省赛 后缀表达式(思维题)

给定 N 个加号、M 个减号以及 N+M+1 个整数 A1,A2,⋅⋅⋅,AN+M+1,小明想知道在所有由这 N 个加号、M 个减号以及 N+M+1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?

请你输出这个最大的结果。

例如使用 123+−,则 “23+1−” 这个后缀表达式结果是 4,是最大的。

输入格式
第一行包含两个整数 N 和 M。

第二行包含 N+M+1 个整数 A1,A2,⋅⋅⋅,AN+M+1。

输出格式
输出一个整数,代表答案。

输入样例:
1 1
1 2 3
输出样例:
4

题解

注意后缀表达式是电脑计算的格式(两个数压栈,遇见符号提取出来计算再压栈)
,根据二叉树的中序遍历得来的表达式才是我们日常所见形式。
编程时可以根据中序遍历二叉树的思路进行求解。

#include
#include
using namespace std;
long long a[1000000];
int main(){
     
	long long n,m,sum=0;
	cin>>n>>m;
	for(long long i=0;i<n+m+1;i++)cin>>a[i];
	sort(a,a+m+n+1);
	if(m==0){
     
		for(long long i=0;i<n+m+1;i++)sum+=a[i];
	} 
	// 根节点(符号)左右子树都要有节点,于是可以让根节点为- 
	// A-(B-C-D)
	// 于是找出来唯一减去的B(最小值)和初始的A(最大值) 
	// 对于负数可以使用+放在右子树,+用完还可以使用-放在左子树,最终效果是把负数全转化为正数相加 
	// 但是可能全是正数或者全是负数,这样不能全部放在一边要取出来一个于是有了以下操作。 
	else{
     
		sum+=a[n+m]-a[0];
		for(long long i=1;i<n+m;i++)sum+=abs(a[i]);
	}
		cout<<sum<<endl;
	return 0; 
}

你可能感兴趣的:(蓝桥杯,二叉树,算法)