蓝桥杯 2019年初赛 后缀表达式

给定N 个加号、M 个减号以及N + M + 1 个整数A1,A2,…,AN+M+1
小明想知道在所有由这N 个加号、M 个减号以及N + M +1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?
请你输出这个最大的结果。
例如使用1 2 3 + -,则“2 3 + 1 -” 这个后缀表达式结果是4,是最大的。
输入
第一行包含两个整数N 和M。
第二行包含N + M + 1 个整数A1,A2,…,AN+M+1
0<=N,M<=100000,-10 ^ 9 <= Ai <= 10 ^ 9
输出
输出一个整数,代表答案。
样例输入
1 1
1 2 3
样例输出
4

详解见代码注释:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[200010];
int main()
{
    //注意 后缀表达式是可以带括号的!!!! 
    ll n,m;
    cin>>n>>m;
    ll len=n+m+1;
    ll f=0,sum=0;
    for(int i=1;i<=len;i++)
    {
        cin>>a[i];
        if(a[i]<0)
        {
            f++; //统计负数的个数  
        }
        sum+=a[i]; 
    }
    sort(a+1,a+len+1); 
    if(m) //如果有负号 
    {
        if(f) //如果有负数 
        {
            if(f==len) //若全为负数   比如 n=3,m=3,  -1 -2 -3 -4 -5 -6 -7,那么最大值必然是:-1-(-2+(-3)+(-4)+(-5))-(-6)-(-7) 
            {          //通过多次尝试可以发现,无论n,m为几,只要全是负数,那么最大值就是 最大的负数+其余所有负数的绝对值 
                for(int i=1;i<len;i++)
                {
                    sum-=2*a[i]; 
                } 
            }
            else //若不全为负数    比如 n=3,m=3,  2 2 2 2 2 -1 -1,最大值的形式为 2+2+2+2-(-1-2)-(-1)  若n=1,m=5 最大值形式为 2+2-(-1-2-2-2)-(-1) 
            {    //通过多次尝试可以发现,无论n,m为几,只要不全为负数,那么最大值就是所有数的绝对值之和 
                for(int i=1;i<=f;i++)
                {
                    sum-=2*a[i]; 
                }   
            }
        }
        else //如果没有负数  比如 n=3,m=2, 1 2 3 4 5 6,那么最大值必然是 6+5+4+3-(1-2)  若n=1,m=4 最大值形式为 6+5-(1-2-3-4)
			 //通过多次尝试可以发现,无论n,m为几,只要全是正数,那么最大值就是  除a[1]外的所有数相加-a[1] 
        	sum-=2*a[1];
    }
	cout<<sum<<endl;
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

henulmh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值