给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。
在一步 操作 中:
选出一个满足 0 <= i < nums.length 的下标 i ,
将你的 分数 增加 nums[i] ,并且
将 nums[i] 替换为 ceil(nums[i] / 3) 。
返回在 恰好 执行 k 次操作后,你可能获得的最大分数。
向上取整函数 ceil(val) 的结果是大于或等于 val 的最小整数。
https://leetcode.cn/problems/maximal-score-after-applying-k-operations/
/*
* Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.
*/
package com.huawei.prac;
import java.util.PriorityQueue;
import java.util.Queue;
public class Solution11th {
public static void main(String[] args) {
int[] nums = {10, 10, 10, 10, 10};
System.out.println(maxKelements(nums,5));
System.out.println(maxKelements(new int[]{1,10,3,3,3}, 3));
}
/**
* 2530. 执行 K 次操作后的最大分数[优先队列]
*
* @param nums 整数数组
* @param k 可操作次数
* @return 最大得分数
*/
public static long maxKelements(int[] nums, int k) {
Queue<Integer> priorityQueue = new PriorityQueue<>((x, y) -> y - x);
for (int num : nums) {
priorityQueue.offer(num);
}
int num;
long count = 0;
while (k-- > 0) {
num = priorityQueue.poll();
count += num;
// 向上取整
priorityQueue.add((int) Math.ceil(num / 3.0));
}
return count;
}
}