LeetCode每日一题:2530. 执行 K 次操作后的最大分数(2023.10.18 C++)

目录

2530. 执行 K 次操作后的最大分数

题目描述:

实现代码与解析:

贪心 + 优先级队列

原理思路:


2530. 执行 K 次操作后的最大分数

题目描述:

        给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。

在一步 操作 中:

  1. 选出一个满足 0 <= i < nums.length 的下标 i ,
  2. 将你的 分数 增加 nums[i] ,并且
  3. 将 nums[i] 替换为 ceil(nums[i] / 3) 。

返回在 恰好 执行 k 次操作后,你可能获得的最大分数。

向上取整函数 ceil(val) 的结果是大于或等于 val 的最小整数。

示例 1:

输入:nums = [10,10,10,10,10], k = 5
输出:50
解释:对数组中每个元素执行一次操作。最后分数是 10 + 10 + 10 + 10 + 10 = 50 。

示例 2:

输入:nums = [1,10,3,3,3], k = 3
输出:17
解释:可以执行下述操作:
第 1 步操作:选中 i = 1 ,nums 变为 [1,4,3,3,3] 。分数增加 10 。
第 2 步操作:选中 i = 1 ,nums 变为 [1,2,3,3,3] 。分数增加 4 。
第 3 步操作:选中 i = 2 ,nums 变为 [1,1,1,3,3] 。分数增加 3 。
最后分数是 10 + 4 + 3 = 17 。

提示:

  • 1 <= nums.length, k <= 105
  • 1 <= nums[i] <= 109

实现代码与解析:

贪心 + 优先级队列

class Solution {
public:
    long long maxKelements(vector& nums, int k) {
        priority_queue q;

        for (auto t: nums) {
            q.push(t);
        }

        long long res = 0;
        while(k--) {
            int t = q.top();
            cout << t << endl;
            q.pop();
            res += t;
            q.push((t + 2) / 3); // 妙啊
        }
        return res;
    }
};

原理思路:

        简单题,每次选出最大的,很容易想到优先级队列,取最大计算,然后/3后再次入队。

 q.push((t + 2) / 3); // 妙啊

        如果在+2前本身就不够除3就会/3后比不+2的值大1,若正好除3,+2,/3后就是会向下取整,也能得到正确值。和四舍五入+0.5有异曲同工之妙。

        最近的题都挺简单的,就没写题解。

你可能感兴趣的:(LeetCode,leetcode,c++,算法)