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<int> 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;
}