LINK
题意:给出n个药水,初始生命为0,问在生命值为非负数的情况下最多可以喝多少瓶药水
分析:药水按顺序喝,如果为整数就加到当前生命值中,如果为负数就放入优先队列,当生命值为负的时候,加上优先队列中第一个的绝对值,数量-1 相当于反悔了,每次都反悔喝过之前的负数最大的
AC代码:
#include<bits/stdc++.h>
#include<queue>
using namespace std;
typedef long long ll;
int a[200010];
int main()
{
ll n,sum,ans;
sum=ans=0;
scanf("%lld",&n);
priority_queue<int>q;//优先队列 从大到小排序
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]<0)
{
q.push(-a[i]);
sum+=a[i];
ans++;
if(sum<0)
{
int h=q.top();
sum+=h;
ans--;
q.pop();
}
}
if(a[i]>=0)
{
sum+=a[i];
ans++;
}
}
printf("%lld\n",ans);
}