2019年蓝桥杯 省赛 c++ B组 ----后缀表达式

题目链接

解题思路:

首先要知道 后缀表达式是什么

后缀表达式 没有括号  但是是可以使用括号的  括号和符号的位置也是可以随意摆放

所以 加法 和 减法 可以因为括号的摆放随意切换 (前提是存在减号

当减号不够的时候  把加号放在括号中 就都成减号了

所以只要存在 至少一个减号 (n个加号  m个减号 ) 那么

减号的数量可以 在 1  和  n+m 中取任意一个  (括号的作用

所以在这个题中  分为两类

一、 m=0 即 没有减号  那就正常相加

二、m != 0  统计负数的个数 ans

     1,  ans=0   即全是正数  那就取一个减号 (因为至少一个)

          所以把最小的数减去 

     2.  ans = n+m+1  即全是负数   那就取 n+m个减号  所以把最大的负数留下 (绝对值小)

         其余的数全部变成相反数  

     3.   有正数也有负数

          这种情况下  有几个负数就取几个减号  来把它们变成正数 

         所以答案是 所有绝对值相加

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
ll a[maxn];
int main() 
{
	int n,m;
	int i,j;
	int ans=0;//统计负数 
	ll sum=0;
	ll num=0;
	cin>>n>>m;
	for(i=1;i<=n+m+1;i++)
	{
		cin>>a[i];
		if(a[i]<0)
		  ans++;
		sum+=abs(a[i]);
		num+=a[i];
	}
	if(m==0)
	{
		cout<<num<<endl;
		return 0;
	}
	sort(a+1,a+n+m+1+1);
	if(ans==0) //全是正数
	{
		sum-=a[1];
		sum-=a[1];
	} 
	if(ans==(n+m+1))//全是负数
	{
		sum+=a[n+m+1];
		sum+=a[n+m+1];
	} 
	cout<<sum<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43819762/article/details/109081650