思路解析
本题目很容易做错,我刚看到这道题目的时候想到的思路是我对a进行排序,根据正负号,对数值大数相加,数值小的数相减。后来又了解了一下后缀表达式也就是逆波兰式,逆波兰表达式就是二叉树的后序排序的结果,并且二叉树的叶子节点是数字,内部节点是符号,如果根节点是“-”,就是左子树-右子树。根据这一定义,如果m!=0,减号的个数为1~m+n个而并非m个,这里是最重要的点!!!
所以我们可以让a[i]>0就+,a[i]0,就-
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int a[N];
typedef long long ll;
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m+n+1;i++){
cin>>a[i];
}
sort(a,a+m+n+1);
ll sum=a[m+n];
if(m==0){
for(int i=0;i<m+n;i++){
sum=(ll)sum+a[i];
}
}
else{
sum-=a[0];
for(int i=1;i<m+n;i++){
if(a[i]>0){
sum=(ll)sum+a[i];
}
else{
sum=(ll)sum-a[i];
}
}
}
cout<<sum;
return 0;
}