牛客小白月赛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;
}
posted @ 2025-04-11 21:58  PZnwbh  阅读(12)  评论(0)    收藏  举报