LC 100320. 执行操作可获得的最大总奖励 II

https://leetcode.cn/problems/maximum-total-reward-using-operations-ii/description/

这里最开始使用的是sortedset实现,但是这个bitset实现太慢了。

class Solution:
    def maxTotalReward(self, rewardValues: List[int]) -> int:
        from sortedcontainers import SortedSet
        sl = SortedSet([0])
        rewardValues.sort()

        for x in rewardValues:
            tmp = []
            for y in sl:
                if y >= x: break
                tmp.append(x + y)
            # print(x, sl, tmp)
            sl.update(tmp)

        return sl[-1]

这个我以为python下面有什么更好的Bitset库来着,原来直接使用内置的整数就可以有效地实现bit ops. 这个 `bit_length` 实现以及下面的类似 `bit_count` 好像是在3.11之后才有的。

class Solution:
    def maxTotalReward(self, rewardValues: List[int]) -> int:
        f = 1

        for v in sorted(set(rewardValues)):
            f |= (f & ((1 << v) - 1)) << v

        return f.bit_length() - 1