牛客小白月赛114——神孙权
题目
题解
我们可以求出前缀和、后缀和,我们还需要求出技能最多可以使用多少次,我们可以靠模拟得出结果,也可以靠数学公式得出结论。如果我们用每次遍历前后缀数组的所有情况,复杂度为 O(n2) ,但是我们要是预处理出一边的最值,比如预处理最大后缀和 mx[i] ,表示从第 i 张牌开始往后取的最大价值,最后我们再枚举抽取方式,那我们就可以把复杂度降到 O(n)。
参考代码
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, k;
int a[N], pre[N], suf[N];
int mx[N];
signed main() {
cin >> n >> k;
for(int i = 1; i <= n; i++) {
cin >> a[i];
pre[i] = pre[i - 1] + a[i];
}
for(int i = n; i >= 1; i--) suf[i] = suf[i + 1] + a[i];
int limit = 0;
while(limit <= k) {
k -= limit;
k++;
limit++;
}
limit = min(limit, n);
int ans = 0;
for(int i = n; i >= 1; i--) mx[i] = max(mx[i + 1], suf[i]);
for(int i = 0; i <= limit; i++) ans = max(ans, mx[n - limit + i + 1] + pre[i]);
cout << ans << endl;
return 0;
}