题意:
有一堆药水,每瓶一个正数或者是负数,可以选择喝与不喝,问最多可以喝多少瓶药水,
使得最后的数值不为负数。
题解:
遇到正数的药水直接喝,遇到非正数的药水先喝,直到总喝为负数了,再把最小的那瓶负数的药水吐出来。
代码:
#include<iostream>
#include<string>
#include<queue>
using namespace std;
typedef long long ll;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
ll n; cin >> n;
ll cnt = 0, sum = 0;
priority_queue<ll, vector<ll>, greater<ll> >q;
//先进先出
for (int i = 1; i <= n; ++i) {
ll num;
cin >> num;
if (num >= 0) {
sum += num;
cnt++;
}
else {
sum += num;// 先喝扣hp的药
cnt++;
q.push(num);//入队
if (sum < 0) {
sum += -(q.top());
cnt--;
q.pop();
}
}
}
cout << cnt;
return 0;
}
本文介绍了一种算法解决关于药水问题,通过优先选择正数药水并适时吐出负数药水,以达到最终非负数值的最多药瓶数量。通过队列实现的策略确保了最优化解。
375

被折叠的 条评论
为什么被折叠?



