题目链接:Potions (Hard Version) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题意:
就是一路上我一直吃药,但是要保证吃完药我的健康值是正的,不能小于0,贪心+优先队列,我们想让自己健康值累加大,那么就要保证尽量去吃小负数的药瓶,因为减去越少,后面我们能吃的药越多(就是吃~,良药苦口~)。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
typedef long long LL;
int a[N];
int main()
{
int n;
cin >> n;
//默认大根堆(从大到小排)
priority_queue<LL> pq;
LL res = 0, ans = 0;
for(int i=0;i<n;i++) cin >>a[i];
for(int i=0;i<n;i++)
{
//因为咱们要贪婪一点所以(只让负数进去就好),方便后面弹出减去多的负数
if(a[i] < 0) pq.push(-a[i]);
ans++;
res = res + a[i];
if(res < 0)
{
res = res + pq.top();
pq.pop();
ans--;
}
}
cout << ans;
return 0;
}