LC 2809. 使数组和小于等于 x 的最少时间
https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/description/
这题看了题解才知道怎么搞的。题解 https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/solutions/2374920/jiao-ni-yi-bu-bu-si-kao-ben-ti-by-endles-2eho/
前面几步思路都差不多了,直到提示4这里。
这里是按照nums2的顺序,分别考虑保留t个子序列的代价,但是为什么这样可以是最优的呢?我其实还是有点疑惑的,大致可以这样想:
- 如果不考虑nums1的影响,那么按照nums2的顺序这样选择是没有问题的,甚至只需要贪心就行。
- 如果考虑了nums1的话,那么就需要使用dp来确保选择是最优的。
class Solution: def minimumTime(self, nums1: List[int], nums2: List[int], x: int) -> int: xs = list(zip(nums1, nums2)) xs.sort(key=lambda x: x[1]) s1 = sum(nums1) s2 = sum(nums2) n = len(nums1) f = [0] * (n + 1) f[0] = 0 for a, b in xs: for j in reversed(range(1, n + 1)): f[j] = max(f[j], f[j - 1] + a + b * j) for t in range(n + 1): if (s1 + s2 * t - f[t]) <= x: return t return -1