CF 1526C2. Potions (Hard Version)


Potions (Hard Version)

题意

\(n\) 个药品,从左到右摆放,每到达一个药瓶处,你可以选择喝下或不喝药,并增加 \(a_i\) 血量(注意 \(a_i\) 可能为负数)。

你的血量初始值为 \(0\) ,从最左边开始走到最右边,你需要保证每时每刻血量都不为负数,请问最多可以喝下多少瓶药?

分析

反悔贪心,从左到右把药品全部喝下,当喝下某一个药,血量成为负数,那我们就反悔,对前面减血量最多的药品选择不喝。

Code

void solve ()
{
    int n, ret = 0, hp = 0; cin >> n;
    priority_queue neg;
    for (int i = 0; i < n; i ++ )
    {
        int x; cin >> x;
        if (x < 0) neg.push(-x);
        hp += x; ret ++ ;
        if (hp < 0)
        {
            ret -- ; hp += neg.top(); neg.pop();
        }
    }
    cout << ret << endl;
}