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)。

相关推荐
cici158741 小时前
彩色图像模糊增强(Fuzzy Enhancement)MATLAB 实现
开发语言·算法·matlab
宝贝儿好2 小时前
【LLM】第二章:HuggingFace入门学习
人工智能·深度学习·神经网络·学习·算法·自然语言处理
凌波粒2 小时前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
啵啵啵鱼2 小时前
数组---完
算法·排序算法
嘿黑嘿呦2 小时前
chap 8排序
算法·蓝桥杯·排序算法·软件工程
richdata2 小时前
需求预测终极指南:零售商品预测方法、算法与AI实践
人工智能·算法·零售
隔窗听雨眠3 小时前
C语言函数递归从入门到精通(下):性能优化与工程实践
c语言·算法·性能优化
退休倒计时3 小时前
【每日一题】LeetCode 146. LRU 缓存 TypeScript
算法·leetcode·缓存·typescript
珊瑚里的鱼3 小时前
【递归】汉诺塔
算法·深度优先
WL学习笔记3 小时前
单项不带头不循环链表
数据结构·链表