【问题描述】
给定 N 个加号、M 个减号以及 N+M+1 个整数 A1, A2, ⋅⋅⋅, AN+M+1,
小明想知道在所有由这 N 个加号、M 个减号以及 N+M+1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?请你输出这个最大的结果。
例如使用 123+−,则 “23+1−” 这个后缀表达式结果是 4,是最大的。
【输入格式】
第一行包含两个整数 N 和 M。
第二行包含 N+M+1 个整数 A1, A2, ⋅⋅⋅, AN+M+1
【输出格式】
输出一个整数,代表答案。
【输入样例】
1 1
1 2 3
【输出样例】
4
【评测用例规模与约定】
0 ≤ N, M ≤ 105
−109 ≤ Ai ≤ 109
解题思路:
朴素解: 不全对,但是能得部分分,而且得分好像还不少。。。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 200010;
typedef long long LL;
int n, m;
int a[N];
int main()
{
cin >> n >> m;
int k = n + m + 1;
for(int i = 0; i < k; i ++) scanf("%d", &a[i]);
LL ans = 0;
if(!m) // 减号的数量为 0
{
for (int i = 0; i < n + m + 1; i ++) ans += a[i];
}
else
{
sort(a, a + k);
ans = a[n + m];
for (int i = n + m - 1, cnt = 0; cnt < n; i --, cnt ++) ans += a[i];
for (int i = 0; i < m; i ++) ans -= a[i];
}
cout << ans << endl;
return 0;
}
最优解:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 200010;
typedef long long LL;
int n, m;
int a[N];
int main()
{
cin >> n >> m;
int k = n + m + 1;
for(int i = 0; i < k; i ++) scanf("%d", &a[i]);
LL ans = 0;
if(!m) // 减号的数量为 0
{
for (int i = 0; i < n + m + 1; i ++) ans += a[i];
}
else
{
sort(a, a + k);
ans = a[n + m] - a[0]; // 只保留一个减号
for (int i = 1; i < k - 1; i ++) ans += abs(a[i]);
}
cout << ans << endl;
return 0;
}