因为需要分给3个人,可以考虑先分一个人,然后计算剩下的糖果分给两个人的方案,考虑满足要求第一个人的糖果数量x,0 <= x <= min(limit, n),则剩下的两个人分的糖果数量k为max(0, n - limit) <= k <= n,若k <= limit则有k + 1种方案,若k > limit,则有(limit - (k - limit) + 1)种方案
1 2 3 4 5 6 7 8 9 10 11
classSolution: defdistributeCandies(self, n: int, limit: int) -> int: ans = 0 for i inrange(max(0, n - limit), n + 1): if i > limit * 2: return ans if limit >= i: ans += i + 1 else: ans += limit - (i - limit) + 1 return ans
@cache deff(i: int, l: int, e: int, t: int) -> int: if i == 0: return1if l == e == t == 0else0 res = f(i - 1, 0, e, t) res += f(i - 1, l, e, 0) res += f(i - 1, l, max(0, e - 1), t) res += f(i - 1, l, e, t) * 23 return res % (10 ** 9 + 7)
给你一个下标从 0 开始大小为 m * n 的整数矩阵 values ,表示 m 个不同商店里 m * n 件不同的物品。每个商店有 n 件物品,第 i 个商店的第 j 件物品的价值为 values[i][j] 。除此以外,第 i 个商店的物品已经按照价值非递增排好序了,也就是说对于所有 0 <= j < n - 1 都有 values[i][j] >= values[i][j + 1] 。
每一天,你可以在一个商店里购买一件物品。具体来说,在第 d 天,你可以:
选择商店 i 。
购买数组中最右边的物品 j ,开销为 values[i][j] * d 。换句话说,选择该商店中还没购买过的物品中最大的下标 j ,并且花费 values[i][j] * d 去购买。
n, m = len(values), len(values[0]) for i inrange(n): heap.append((-values[i][0], i, 0))
heapify(heap) ans = 0 for i inrange(n * m, 0, -1): poll = heappop(heap) v, x, y = poll[0], poll[1], poll[2] ans += -i * v if y < m - 1: heappush(heap, (-values[x][y + 1], x, y + 1)) return ans