题目信息
解题思路
- 想让答案最大,对于每个x,一定选择最大的s和前x - 1大的a或者前x个最大的a。
- 用sum数组记录a的前缀和,bi记录a数组前i项的最大值,c[i]记录表达式a[i] * 2 + s[i]后i项的最大值。
- 答案 = max(sum[x] + 2 * b[x], sum[x - 1] + c[x])
不太熟悉前缀和的童鞋请移步这里。
代码实现
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
struct node {
int s, a;
} a[N];
inline bool cmp(node x, node y) {
return x.a > y.a;
}
int sum[N], b[N], c[N];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i].s;
}
for (int i = 1; i <= n; ++i) {
cin >> a[i].a;
}
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; ++i) {
sum[i] = sum[i - 1] + a[i].a;
}
for (int i = 1; i <= n; ++i) {
b[i] = max(b[i - 1], 2 * a[i].s);
}
for (int i = n; i >= 1; --i) {
c[i] = max(c[i + 1], 2 * a[i].s + a[i].a);
}
for (int i = 1; i <= n; ++i) {
cout << max(sum[i] + b[i], sum[i - 1] + c[i]) << '\n';
}
return 0;
}