题目链接:点击进入
题目

题意
n 个瓶子,每个瓶子都有价值( 有正有负,正的加血,负的减血 ),初始生命值 0 ,问在保证过程中血量不小于 0 的情况下,最多可以选择多少个瓶子( 每个瓶子可以选择也可以不选择 )
思路
对于价值为正的瓶子,我们肯定选择,若瓶子的价值为负:
若我们喝下去生命值不会变为负数,我们选择喝下去。
若我们喝下去生命值会变为负数,那么我们将此时的这瓶水,与之前喝过的、价值为负数的 且 价值最低的瓶子做比较,
若此时的价值更低,那么我们不选择这个瓶子;
若此时价值更高,那么我们选择这瓶,将之前选择的用来做对比的那瓶水抛弃掉(不喝)
所以,我们需要用一个 优先队列 来维护之前喝过的、价值为负数的、价值最低的瓶子价值。
剩下的就是贪心统计答案了。
代码
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
//#pragma GCC optimize(3)//O3
//#pragma GCC optimize(2)//O2
//#include<bits/stdc++.h>
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<bitset>
#include<fstream>
#define

本文介绍了一种利用优先队列解决贪心策略问题的方法,具体场景为选择瓶子以确保生命值始终非负。通过维护一个最小堆来存储负价值的瓶子,并比较新出现的负价值瓶子与堆顶瓶子,动态调整选择策略。代码中使用了C++的`priority_queue`来实现这一过程,最终得出能选择的最大瓶子数量。
最低0.47元/天 解锁文章
294

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



