第十届蓝桥杯省赛C++B组 后缀表达式

后缀表达式

题目链接-后缀表达式
在这里插入图片描述
解题思路

  • 当只有加减符号时,后缀表达式相当于带括号的中缀表达式
  • m==0时,我们只能将这些数相加,所以最大值即为 n + m + 1 n+m+1 个整数的和
  • m!=0,即至少有一个减号时:
  1. 当减号数目小于负数数目时,由于后缀表达式具有隐含的括号,相当于带括号的中缀表达式,所以只要有一个减号,既可以衍生出无数的减号, e g : a ( b + c + + z ) = a b c z eg:a-(b+c+…+z)=a-b-c-…-z ,(n=3,m=1 N个整数分别为4,-1,-2,-3,-4时,可以写成4-((-1)+(-2)+(-3)+(-4))=14)
  2. 当减号数目大于负数数目时,必定要减去一个数,所以我们减去一个最小的数就行了 e g 1 eg1 :n=1,m=1,N个数分别为1,2,3,可以写成3+2-1=4, e g 2 eg2 :n=0,m=2,N个数分别为1,2,3,可以写成3-(1-2)=3+2-1=4
  3. 当减号数目等于负数数目时,显然,直接全部都加上绝对值就行(n=2,m=2,N个整数分别为2,4,-3,-6,可以写成2+4-(-3)-(-6)=15)
  • 综上,m!=0时,我们加上最大值,减去最小值,其他数都加上绝对值即可
  • 具体操作见代码

附上代码

#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const int dir[4][2]={-1,0,1,0,0,-1,0,1};
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=2e5+5;
typedef long long ll;
typedef pair<int,int> PII;
int a[N]; 
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	int n,m,ans=0;
	cin>>n>>m;
	int k=n+m+1;
	for(int i=1;i<=k;i++)
		cin>>a[i];
	sort(a+1,a+k+1);
	if(!m){
		for(int i=1;i<=k;i++)
			ans+=a[i];
		cout<<ans<<endl;
	}
	else{
		ans+=a[k];ans-=a[1];
		for(int i=2;i<k;i++)
			ans+=abs(a[i]);
		cout<<ans<<endl;
	}
	return 0;
}

发布了175 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/105106272