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

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

在一步 操作 中:

选出一个满足 0 <= i < nums.length 的下标 i ,

将你的 分数 增加 numsi ,并且

将 numsi 替换为 ceil(numsi / 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,2,1,3,3 。分数增加 3 。

最后分数是 10 + 4 + 3 = 17 。

提示:

1 <= nums.length, k <= 105^55

1 <= numsi <= 109^99

把输入数组堆化,然后每次都取堆顶的最大元素,之后将其除3再入堆即可:

cpp 复制代码
class Solution {
public:
    long long maxKelements(vector<int>& nums, int k) {
        long long ans = 0;
        make_heap(nums.begin(), nums.end());

        for (int i = 0; i < k; ++i) {
            ans += nums[0];
            
            pop_heap(nums.begin(), nums.end());
            nums.back() = ceil((double)nums.back() / 3);
            push_heap(nums.begin(), nums.end());
        }

        return ans;
    }
};

如果nums的长度为n,则此算法时间复杂度为O(n+klogn),空间复杂度为O(1)。

相关推荐
YSL0701248 小时前
OpenCode保姆级安装教程
数据结构
鹿角片ljp8 小时前
LeetCode 148:排序链表|归并排序、快慢指针找左中点与链表断开
算法
LabVIEW开发8 小时前
LabVIEW字符串特殊字符检测兼容
算法·labview·labview知识·labview功能·labview程序
晴天的雨.9928 小时前
[C++算法]快乐数
数据结构·c++·算法
孤狼warrior9 小时前
SCTR 五次失败的安全 BN 路由器
人工智能·python·深度学习·算法·安全·yolo
影视飓风TIM9 小时前
C++11 核心新特性完整梳理
数据结构·c++·算法
晴天的雨.9929 小时前
[C++]算法双指针 复写0
数据结构·c++·算法
橘子汽水1689 小时前
Leetcode 128,49最长连续序列,字母异位词分组
java·算法·leetcode
圣保罗的大教堂9 小时前
leetcode 1140. 石子游戏 II 中等
leetcode