定制类做网站多少钱,网络营销战略规划,win7优化设置,温州软件开发公司有哪些题目描述#xff1a;
小扣当前位于魔塔游戏第一层#xff0c;共有 N 个房间#xff0c;编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums#xff0c;其中正数表示道具补血数值#xff0c;即血量增加对应数值#xff1b;负数表示怪物造成伤害值#x…题目描述
小扣当前位于魔塔游戏第一层共有 N 个房间编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums其中正数表示道具补血数值即血量增加对应数值负数表示怪物造成伤害值即血量减少对应数值0 表示房间对血量无影响。
小扣初始血量为 1且无上限。假定小扣原计划按房间编号升序访问所有房间补血/打怪为保证血量始终为正值小扣需对房间访问顺序进行调整每次仅能将一个怪物房间负数的房间调整至访问顺序末尾。请返回小扣最少需要调整几次才能顺利访问所有房间。若调整顺序也无法访问完全部房间请返回 -1。 示例 1 输入nums [100,100,100,-250,-60,-140,-50,-50,100,150] 输出1 解释初始血量为 1。至少需要将 nums[3] 调整至访问顺序末尾以满足要求。 示例 2 输入nums [-200,-300,400,0] 输出-1 解释调整访问顺序也无法完成全部房间的访问。 提示 1 nums.length 10^5-10^5 nums[i] 10^5 思路
按照原计划访问所有房间当访问到第 i个房间时如果生命值小于等于 0那么必须对房间顺序进行调整
显然选择第 i个房间之后的房间是没有意义的它并不会改变当前的生命值减少的情况
因此只能选择第 i个房间及之前的房间。对于所有可选的房间无论将哪个房间调整至末尾都不会改变最终的生命值因为数组 nums的和不会变化。由于希望调整的次数最少因此应当贪心地选择最小的那个 nums[j]调整至末尾使得当前的生命值尽可能高。
顺序遍历房间如果 nums[i]为负数将其放入一个小根堆优先队列中。当计算完第 i个房间的生命值影响后如果生命值小于等于 0那么取出堆顶元素表示将该房间调整至末尾并将其补回生命值中。由于一定会从小根堆中取出一个小于等于 nums[i]的值因此调整完成后生命值一定大于 0。
当所有房间遍历完成后还需要将所有从堆中取出元素的和重新加入生命值如果生命值小于等于 0说明无解。
代码
class Solution {public int magicTower(int[] nums) {int ans 0;PriorityQueueInteger pq new PriorityQueue();long hp 1, delay 0;for (int val : nums) {if (val 0) {pq.offer(val);}hp val;if (hp 0) {ans;int cur pq.poll();hp - cur;delay cur;}}hp delay;if (hp 0) {return -1;}return ans;}
}