力扣LCP 30. 魔塔游戏(贪心+小顶堆)
贪心
模拟过程,将之前扣减的血量都放入优先队列中,每次快死之前,就取出堆顶的元素(扣最多的血)给自己加上,这样的贪心思想能保证我们移动到尾部的元素是最少的
优先级队列priority_queue
这是一个拥有权值queue,其内部元素按照元素的权值排列。权值较高者排在最前优先出队。其中缺省情况下系统是通过一个max-heap以堆实现完成排序特性,表现为一个以vector表现的完全二叉树。
//升序队列 小顶堆 great 小到大
priority_queue <int,vector<int>,greater<int> > pq;
//降序队列 大顶堆 less 大到小 默认
priority_queue <int,vector<int>,less<int> > pq;
函数/方法
- top() 访问队头
- empty()
- size()
- push() / emplace
- pop
- swap
class Solution {
public:
int magicTower(vector<int>& nums) {
priority_queue<int,vector<int>,greater<int>>q;
long long hp=1;
long long neg=0;
int count=0;
for(int i=0;i<nums.size();i++)
{
hp+=nums[i];
}
if(hp<=0)return -1;
hp=1;
for(int i=0;i<nums.size();i++)
{
if(nums[i]<0){
q.push(nums[i]);
}
while(hp+nums[i]<=0)
{
hp-=q.top();
neg+=q.top();
q.pop();
count++;
}
hp=hp+nums[i];
}
return count;
}
};