100325. 找出 K 秒后拿着球的孩子
原题链接
思路分析
数据很小,暴力或者数学方法都行
数学方法就是对 n - 1做带余除法,看跑了奇数还是偶数趟,余数如何,确定位置
时间复杂度:O(1)
AC代码
python
class Solution:
def numberOfChild(self, n: int, k: int) -> int:
a, r = divmod(k, n - 1)
if a & 1:
return n - 1 - r
return r
100305. K 秒后第 N 个元素的值
原题链接
思路分析
为了抢时间直接暴力了
时间复杂度O(NK)
AC代码
python
class Solution:
def valueAfterKSeconds(self, n: int, k: int) -> int:
a = [1] * n
for _ in range(k):
for i in range(1, n):
a[i] += a[i - 1]
a[i] %= (10**9 + 7)
return a[n - 1]
100319. 执行操作可获得的最大总奖励 I
原题链接
思路分析
见下面
AC代码
python
from sortedcontainers import SortedList
class Solution:
def maxTotalReward(self, w: List[int]) -> int:
w = sorted(set(w))
n = len(w)
st, msk, p = 1, 0, 0
for i in range(n):
while p < w[i]:
msk |= (1 << p) & st
p += 1
st |= msk << w[i]
res = w[-1] * 2 - 1
while not (st >> res & 1):
res -= 1
return res
100320. 执行操作可获得的最大总奖励 II
原题链接
思路分析
其实就是01背包,每个数字选或不选
我们将物品升序排序
定义状态f(i, j)为前 i 个数是否能够凑够j
f(i, j) = { f(i, j) | f(i, j - w[i]) } | f(i - 1, j)
只涉及或运算,我们考虑bitset优化
分别记录当前集合的状态f, 和w[i]位之前的状态msk
那么f = f | msk
时间复杂度:O(NM / 64)
略解释一下bitset优化:我们每次都是将当前行的一段状态和上一行的一段状态做或运算,一个一个做太慢了,所以我们用二进制位来表示每一行的每个元素的状态,一个int可以表示32个状态,longlong同理,事实上按题面的数据量来说不一定能过,但是......
AC代码
python
from sortedcontainers import SortedList
class Solution:
def maxTotalReward(self, w: List[int]) -> int:
w = sorted(set(w))
n = len(w)
st, msk, p = 1, 0, 0
for i in range(n):
while p < w[i]:
msk |= (1 << p) & st
p += 1
st |= msk << w[i]
res = w[-1] * 2 - 1
while not (st >> res & 1):
res -= 1
return res