leetcode 3075. 幸福值最大化的选择方案 中等

给你一个长度为 n 的数组 happiness ,以及一个正整数 k

n 个孩子站成一队,其中第 i 个孩子的 幸福值happiness[i] 。你计划组织 k 轮筛选从这 n 个孩子中选出 k 个孩子。

在每一轮选择一个孩子时,所有尚未 被选中的孩子的 幸福值 将减少 1 。注意,幸福值不能变成负数,且只有在它是正数的情况下才会减少。

选择 k 个孩子,并使你选中的孩子幸福值之和最大,返回你能够得到的最大值

示例 1:

复制代码
输入:happiness = [1,2,3], k = 2
输出:4
解释:按以下方式选择 2 个孩子:
- 选择幸福值为 3 的孩子。剩余孩子的幸福值变为 [0,1] 。
- 选择幸福值为 1 的孩子。剩余孩子的幸福值变为 [0] 。注意幸福值不能小于 0 。
所选孩子的幸福值之和为 3 + 1 = 4 。

示例 2:

复制代码
输入:happiness = [1,1,1,1], k = 2
输出:1
解释:按以下方式选择 2 个孩子:
- 选择幸福值为 1 的任意一个孩子。剩余孩子的幸福值变为 [0,0,0] 。
- 选择幸福值为 0 的孩子。剩余孩子的幸福值变为 [0,0] 。
所选孩子的幸福值之和为 1 + 0 = 1 。

示例 3:

复制代码
输入:happiness = [2,3,4,5], k = 1
输出:5
解释:按以下方式选择 1 个孩子:
- 选择幸福值为 5 的孩子。剩余孩子的幸福值变为 [1,2,3] 。
所选孩子的幸福值之和为 5 。

提示:

  • 1 <= n == happiness.length <= 2 * 10^5
  • 1 <= happiness[i] <= 10^8
  • 1 <= k <= n

分析:将所有孩子的幸福值排序,每次选择当前幸福值最大的孩子,增加的幸福值为孩子幸福值减去 t,t 的值为当前选择的次数减 1,求出总和即可。

cpp 复制代码
class Solution {
public:
    long long maximumHappinessSum(vector<int>& happiness, int k) {
        int n=happiness.size();
        long long ans=0;
        sort(happiness.begin(),happiness.end());
        for(int i=n-1,t=0;i>=0&&t<k;--i,++t)
        {
            ans+=1LL*max(happiness[i]-t,0);
        }
        return ans;
    }
};
相关推荐
一只齐刘海的猫11 小时前
【Leetcode】找到字符串中所有字母异位词
算法·leetcode·职场和发展
凌波粒13 小时前
LeetCode--108.将有序数组转换为二叉搜索树(二叉树)
算法·leetcode·职场和发展
兰令水14 小时前
leecodecode【面试150】【2026.6.13打卡-java版本】
java·算法·leetcode
临沂堇14 小时前
刷题日志 | Leetcode Hot 100 哈希
算法·leetcode·哈希算法
Navigator_Z16 小时前
LeetCode //C - 1096. Brace Expansion II
c语言·算法·leetcode
笨笨没好名字16 小时前
Leetcode刷题python版第一周
python·算法·leetcode
一只齐刘海的猫17 小时前
【Leetcode】无重复字符的最长子串
算法·leetcode·职场和发展
Tisfy17 小时前
LeetCode 2130.链表最大孪生和:转数组 / 快慢指针+链表翻转(O(1))
算法·leetcode·链表·题解
Tairitsu_H18 小时前
[LC优选算法#5] 分治:快排 | 颜色分类 | 排序数组 | 第K大元素
c++·算法·leetcode·排序算法·快速排序
青山木18 小时前
Hot 100 --- 滑动窗口最大值
java·数据结构·算法·leetcode·动态规划