codeforces 1526 C

题面

在这里插入图片描述

题意

给你一个长度为n的序列a,你的初始生命值为0,你可以选择加上ai,但前提是保证在任何时刻生命值不小于0. 求最多能加多少个值。C1版本的的n为2000,C2版本的n为20000

C1题解

C1的n只有2000,可以直接用dp来做,f[i] [j] 表示在前 i 瓶中选择了 j 瓶的最大价值,就可以由 max ( f[i-1] [j] , f[i-1] [j] +a[i] ) 得到

C1代码

#include<bits/stdc++.h>
 
using namespace std;
typedef long long ll;
const int N = 2005;
const ll INF = 1e15;
 
int n;
ll a[N];
ll f[N][N];  //在前 i 瓶种选择了 j 瓶的最大价值
 
int main() {
 
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j < i; j++) {
            f[i][j] = max(f[i - 1][j - 1] + a[i], f[i - 1][j]);
            if (f[i][j] < 0) f[i][j] = -INF;   //小于0直接赋值无穷大,防止下次更新为正数
        }
        f[i][i] = f[i - 1][i - 1] + a[i];
        if (f[i][i] < 0) f[i][i] = -INF;
    }
    int res = 0;
    for (int i = 0; i <= n; i++) {
        if (f[n][i] >= 0) res = i;
    }
    cout << res << endl;
 
    return 0;
}

C2题解

c2版本的n为20000,dp会超时,考虑贪心,我们用一个小根堆来维护已经选的值,当加入一个值使得总和小于0,那么就删去堆顶元素,直到值不小于0,每次取堆的长度就是所能选的最大长度

C2代码

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 2e5 + 10;

ll n;
ll a[N];

int main() {

    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    priority_queue<int, vector<int>, greater<int>> p;
    int ans = 0;
    ll sum = 0;
    for (int i = 1; i <= n; i++) {
        p.push(a[i]);
        sum += a[i];
        while (sum < 0) {
            sum -= p.top();
            p.pop();
        }
        ans = max(ans, (int) p.size());
    }
    cout << ans << endl;

    return 0;
}
### Codeforces Problem 1332C Explanation The provided references pertain specifically to problem 742B on Codeforces rather than problem 1332C. For an accurate understanding and solution approach for problem 1332C, it's essential to refer directly to its description and constraints. However, based on general knowledge regarding competitive programming problems found on platforms like Codeforces: Problem 1332C typically involves algorithmic challenges that require efficient data structures or algorithms such as dynamic programming, graph theory, greedy algorithms, etc., depending upon the specific nature of the task described within this particular question[^6]. To provide a detailed explanation or demonstration concerning **Codeforces problem 1332C**, one would need direct access to the exact statement associated with this challenge since different tasks demand tailored strategies addressing their unique requirements. For obtaining precise details about problem 1332C including any sample inputs/outputs along with explanations or solutions, visiting the official Codeforces website and navigating to contest number 1332 followed by examining section C is recommended. ```python # Example pseudo-code structure often seen in solving competitive coding questions. def solve_problem_1332C(input_data): # Placeholder function body; actual logic depends heavily on the specifics of problem 1332C. processed_result = process_input(input_data) final_answer = compute_solution(processed_result) return final_answer input_example = "Example Input" print(solve_problem_1332C(input_example)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值