官方题解|取与得
2025-07-21 08:19:55
发布于:浙江
38阅读
0回复
0点赞
取与得
题目大意
你可以任意删除并且重新排列原数组,让生成的数组的总权值最大。
题解思路
- 大的数一定放在前面。
- 在数组后面添加一个数,本质上总权值加上数组前面一段数的和。
因此本题在排序完进行两次前缀和后找到数组中的最大值即可
参考代码
#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
using i32 = int32_t;
using i128 = __int128;
int main() {
ios::sync_with_stdio(0), cin.tie(0);
int n;
cin >> n;
vector<i64> arr(n + 1);
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
sort(arr.begin() + 1, arr.end() ,greater<i64>());
vector<i64> pre(n + 1);
for (int i = 1; i <= n; i++) {
pre[i] = pre[i - 1] + arr[i];
}
for (int i = 1; i <= n; i++) {
pre[i] = pre[i - 1] + pre[i];
}
i64 ms = -1e18;
for (int i = 1; i <= n; i++) {
ms = max(pre[i], ms);
}
cout << ms << endl;
}
这里空空如也
有帮助,赞一个