题目链接:[蓝桥杯 2019 省 B] 后缀表达式 - 洛谷
思路:分类讨论
1.当没有减号时,所有数都取正值;
2.有减号时,且所有数都为正数,那么必须减去一个数,因此减去最小值。
3.有减号时,且所有数都为负数,那么必须有一个数打头,仍是负值,其余数取绝对值。
4.有减号时,且所有数中有正有负,那么选一个正数打头,即所有数都可以去绝对值。
推倒:
若a,b,c为负数,将其转化为正值方法:d - ( a + b + c )
若减号多于负数个数,消去减号的方法: a - ( b - c - d ) (其中c,d为正数,b为负数)
因此只要至少有一个减号,就可以把所有负数变为正数(全为负数时除外)
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 200005;
typedef long long ll;
ll n,m;
ll a[N];
ll ans;
int main()
{
cin>>n>>m;
for(int i=0;i<=m+n;i++) cin>>a[i];
sort(a,a+m+n+1);
if(m==0)
{
for(int i=0;i<=m+n;i++) ans+=a[i];
}
else
{
if(a[0]>0)
{
for(int i=1;i<=m+n;i++) ans+=a[i];
ans-=a[0];
}
else if(a[m+n]<0)
{
for(int i=0;i<m+n;i++) ans+=-a[i];
ans+=a[m+n];
}
else
{
for(int i=0;i<=m+n;i++) ans+=abs(a[i]);
}
}
cout<<ans<<endl;
return 0;
}