LC 6040. 花园的最大总美丽值
https://leetcode-cn.com/problems/maximum-total-beauty-of-the-gardens/
这个题目的核心是一个最优均分方案。对于full garden比较好办,直接进行枚举就行,如何对于partial garden最优化均分方案呢?这个可以是个线性的过程。
假设我们需要在 `X[1…n]` 寻找最优均分方案,并且假设还有K个flowers可以分配:
- 我们可以假设如果最优值至少是 `X[1]`, 那么需要分配 `K - ACC[1]` 个,可以将K个flowers分配到最前面1个元素
- 如果最优值至少是 `X[2]`, 那么需要分配 `K-ACC[2]` 个,我们可以将K个flowers分配到最前面2个元素
- 以此类推,其中ACC是这个X的前缀和。我们寻找最多能分配多个元素,假设j个元素,那么至少可以将 `X[1..j]` 都提升到 `X[j]` 的水平。
class Solution:
def maximumBeauty(self, flowers: List[int], newFlowers: int, target: int, full: int, partial: int) -> int:
base = full * len([x for x in flowers if x >= target])
flowers = [x for x in flowers if x < target]
flowers.sort()
n = len(flowers)
acc = [0] * (n + 1)
for i in range(n):
acc[i + 1] = acc[i] + flowers[i]
j = 0
ans = 0
for i in range(n + 1):
k = newFlowers - ((n - i) * target - (acc[n] - acc[i]))
if k < 0:
continue
while j < i:
fill = flowers[j] * (j + 1) - acc[j + 1]
if fill > k:
break
j += 1
# full (n-i)
# partial can be covered up to j elements.
x = 0 if j == 0 else (acc[j] + k) // j
if j < i:
assert x < flowers[j]
x = min(x, target - 1)
value = full * (n - i) + x * partial
ans = max(ans, value)
return ans + base