通过题目描述,我们可以用贪心来找出最优策略,如果减号的数量为0个,那么我们对所有数字直接进行相加即可,而对于其他情况,我们可以通过添加括号等方法将所有的负数或者减号都抵消成正数,因此这道题只需要将最大的数减去最小的数,再将其他数字的绝对值一一加上即可,同时注意开longlong防止爆掉
上代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define int long long//开longlong防止爆掉
using namespace std;
signed main(void)
{
int n, m; cin >> n >> m;
int cnt = n + m + 1;
int *a = new int[cnt + 10];
for(int i = 1; i <= cnt; i++){
cin >> a[i];
}
if(m == 0){//如果减号的数目为0,就直接把所有的数字加上即可
int ans = 0;
for(int i = 1; i <= cnt; i++) ans += a[i];
cout << ans << endl;
return 0;
}
int ans = 0;
sort(a + 1, a + 1 + cnt);//先将数组从小到大排列
ans = a[cnt] - a[1];//先将最大的和最小的进行减法
for(int i = 2; i < cnt; i++){
ans += abs(a[i]);//其余的数字都能通过括号将负号或者减号进行抵消
}
cout << ans << endl;
return 0;
}