首页 > 其他分享 >力扣每日一题3181.执行操作可获得的最大总奖励2

力扣每日一题3181.执行操作可获得的最大总奖励2

时间:2024-10-26 14:18:35浏览次数:9  
标签:下标 比特 int shift 力扣 奖励 rewardValues 3181 一题

  题目描述:

给你一个整数数组 rewardValues,长度为 n,代表奖励的值。

最初,你的总奖励 x 为 0,所有下标都是 未标记 的。你可以执行以下操作 任意次 

  • 从区间 [0, n - 1] 中选择一个 未标记 的下标 i
  • 如果 rewardValues[i] 大于 你当前的总奖励 x,则将 rewardValues[i] 加到 x 上(即 x = x + rewardValues[i]),并 标记 下标 i

以整数形式返回执行最优操作能够获得的 最大 总奖励。

示例 1:

输入:rewardValues = [1,1,3,3]

输出:4

解释:

依次标记下标 0 和 2,总奖励为 4,这是可获得的最大值。

示例 2:

输入:rewardValues = [1,6,4,3,2]

输出:11

解释:

依次标记下标 0、2 和 1。总奖励为 11,这是可获得的最大值。

解题思路

       在上题中,我们设dp[i][j](true/false)为第一个i奖励后的状态,表示我们是否能得到j分。请注意,dp数组是一个布尔数组。我们只需要每个元素1个比特,所以我们可以使用比特集或类似的东西。我们只需要一个比特的“流”,并应用位操作来通过一个常数因子优化计算。

代码实现

class Solution {
public:
    public:
    int maxTotalReward(vector<int> &rewardValues)
    {
        ranges::sort(rewardValues);
        rewardValues.erase(unique(rewardValues.begin(), rewardValues.end()), rewardValues.end());

        bitset<100000> f{1};
        for (int v : rewardValues)
        {
            int shift = f.size() - v;
            // 左移 shift 再右移 shift,把所有 >= v 的比特位置 0
            // f |= f << shift >> shift << v;
            f |= f << shift >> (shift - v); // 简化上式
        }
        for (int i = rewardValues.back() * 2 - 1;; i--)
            if (f.test(i))
                return i;
    }
};

标签:下标,比特,int,shift,力扣,奖励,rewardValues,3181,一题
From: https://blog.csdn.net/C_Java_python12/article/details/143252819

相关文章

  • sicp每日一题[2.58]
    Exercise2.58Supposewewanttomodifythedifferentiationprogramsothatitworkswithordinarymathematicalnotation,inwhich+and*areinfixratherthanprefixoperators.Sincethedifferentiationprogramisdefinedintermsofabstractdata,we......
  • LeetCode 3181. 执行操作可获得的最大总奖励 II
    1classSolution{2public:3intmaxTotalReward(vector<int>&rewardValues){4intm=ranges::max(rewardValues);5unordered_set<int>s;6for(intv:rewardValues){7if(s.contains(v))......
  • 力扣练习1355.活动参与者
    1355.活动参与者一、题目链接二、题目描述三、建表语句四、题目解答1、思路1讲解2、代码1实现3、思路2讲解4、代码2实现五、知识总结一、题目链接1355.活动参与者二、题目描述表:Friends±--------------±--------+|ColumnName|Type|±--------------±......
  • 20241024每日一题洛谷P1012
    普及-洛谷P1012拼数设有n个正整数,a1a2a3......an将它们联接成一排,相邻数字首尾相接,组成一个最大的整数输入:第一行有一个整数,表示数字个数n第二行有n个整数,表示给出的n个整数ai输出:一个正整数,表示最大的整数可以考虑两种路线:使用sort函数编辑cmp参数进行字符串......
  • 力扣练习1264.页面推荐
    1264.页面推荐一、题目链接二、题目描述三、建表语句四、题目解答1、思路讲解2、代码实现五、知识总结一、题目链接1264.页面推荐(需要会员)二、题目描述朋友关系列表:Friendship±--------------±--------+|ColumnName|Type|±--------------±--------+......
  • 2024-10-23-leetcode每日一题-构成整天的下标对数目 II
    题目描述给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i<j 且 hours[i]+hours[j] 构成 整天 的下标对 i, j 的数目。整天 定义为时间持续时间是24小时的 整数倍 。例如,1天是24小时,2天是48小时,3天是72小时,以此类推。......
  • 【每日一题】LeetCode - 最长回文子串
    在字符串相关的算法题中,寻找最长回文子串是一个经典且富有挑战性的题目。本篇将详细分析并推导两种有效的解决方案:动态规划法和中心扩展法。题目描述给定一个字符串s,我们需要找到s中最长的回文子串。回文是指正着读和反着读都相同的字符串。例如,输入"babad"时,输出可......
  • Leetcode每日一题:3175. 找到连续赢 K 场比赛的第一位玩家
    题意为给定一个数组,数组头两数比大小,大的放队首,小的放队尾,找到能够连续赢K次的数的编号。思路:如果一轮比较完了,没有赢K次的,那答案就是数组最大值。利用双指针,模拟一轮比较,计算每个数的胜利次数,注意,若起点不是0的话,意味着他和之前的数比较是胜出的,所以初始为1,否则初始为0;1clas......
  • 力扣 简单 111.二叉树的最小深度
    文章目录题目介绍题解题目介绍题解最小深度:从根节点到最近叶子结点的最短路径上节点数量。分三种情况讨论即可:当前节点为空,则返回当前节点minDepth=0;当前节点左右子树都存在,则返回当前节点minDepth=左右子树最小深度的最小值+1;当前节点的左右子树其中一个不存......
  • sicp每日一题[2.56]
    Exercise2.56Showhowtoextendthebasicdifferentiatortohandlemorekindsofexpressions.Forinstance,implementthedifferentiationruled(x^n)/dx=nx^(n-1)byaddinganewclausetothederivprogramanddefiningappropriateproceduresexpone......