题目链接
解题思路:
首先要知道 后缀表达式是什么
后缀表达式 没有括号 但是是可以使用括号的 括号和符号的位置也是可以随意摆放
所以 加法 和 减法 可以因为括号的摆放随意切换 (前提是存在减号
当减号不够的时候 把加号放在括号中 就都成减号了
所以只要存在 至少一个减号 (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;
}