leetcode 2234. Beauté totale maximale des jardins (python)

Prenez l'habitude d'écrire ensemble ! C'est le 15ème jour de ma participation au "Nuggets Daily New Plan·April Update Challenge", cliquez pour voir les détails de l'événement .

décrire

Alice est gardienne de n jardins et elle souhaite planter des fleurs pour maximiser la beauté totale de tous ses jardins.

On vous donne un tableau d'entiers indexés à 0 flowers de taille n, où flowers[i] est le nombre de fleurs déjà plantées dans le ième jardin. Les fleurs déjà plantées ne peuvent pas être enlevées. On vous donne alors un autre entier newFlowers, qui est le nombre maximum de fleurs qu'Alice peut planter en plus. Vous disposez également des nombres entiers cible, complet et partiel.

Un jardin est considéré comme complet s'il a au moins des fleurs cibles. La beauté totale des jardins est alors déterminée comme la somme des éléments suivants :

  • Le nombre de jardins complets multiplié par plein.
  • Le nombre minimum de fleurs dans l'un des jardins incomplets multiplié par partiel. S'il n'y a pas de jardins incomplets, cette valeur sera 0.

Renvoyez la beauté totale maximale qu'Alice peut obtenir après avoir planté au maximum des fleurs newFlowers.

Exemple 1:

Input: flowers = [1,3,1,1], newFlowers = 7, target = 6, full = 12, partial = 1
Output: 14
Explanation: Alice can plant
- 2 flowers in the 0th garden
- 3 flowers in the 1st garden
- 1 flower in the 2nd garden
- 1 flower in the 3rd garden
The gardens will then be [3,6,2,2]. She planted a total of 2 + 3 + 1 + 1 = 7 flowers.
There is 1 garden that is complete.
The minimum number of flowers in the incomplete gardens is 2.
Thus, the total beauty is 1 * 12 + 2 * 1 = 12 + 2 = 14.
No other way of planting flowers can obtain a total beauty higher than 14.
复制代码

Exemple 2 :

Input: flowers = [2,4,5,3], newFlowers = 10, target = 5, full = 2, partial = 6
Output: 30
Explanation: Alice can plant
- 3 flowers in the 0th garden
- 0 flowers in the 1st garden
- 0 flowers in the 2nd garden
- 2 flowers in the 3rd garden
The gardens will then be [5,4,5,5]. She planted a total of 3 + 0 + 0 + 2 = 5 flowers.
There are 3 gardens that are complete.
The minimum number of flowers in the incomplete gardens is 4.
Thus, the total beauty is 3 * 2 + 4 * 6 = 6 + 24 = 30.
No other way of planting flowers can obtain a total beauty higher than 30.
Note that Alice could make all the gardens complete but in this case, she would obtain a lower total beauty.
复制代码

Noter:

1 <= flowers.length <= 10^5
1 <= flowers[i], target <= 10^5
1 <= newFlowers <= 10^10
1 <= full, partial <= 10^5
复制代码

Analyser

Selon le titre, Alice est la gardienne de n jardins et elle veut planter des fleurs pour maximiser la beauté globale de tous ses jardins.

Soit un tableau d'entiers indexés à 0 flowers de taille n, où flowers[i] est le nombre de fleurs qui ont été plantées dans le ième jardin. Les fleurs déjà plantées ne peuvent pas être enlevées. Ensuite, on vous donne un autre entier newFlowers, qui est le nombre maximum de fleurs supplémentaires qu'Alice peut planter. De plus, les paramètres cible, complet et partiel sont également donnés.

Un jardin est considéré comme complet s'il a au moins des fleurs cibles. La valeur esthétique globale de tous les jardins est alors déterminée comme la somme des éléments suivants :

  • Multipliez le nombre de jardins pleins par le plein
  • Le nombre minimum de fleurs à apparaître dans un jardin incomplet multiplié par partiel. partiel vaut 0 s'il n'y a pas de jardins incomplets

Renvoie l'esthétique globale maximale qu'Alice peut obtenir en plantant le plus de fleurs newFlowers.

Ce problème est évidemment un algorithme gourmand.Pour maximiser la beauté globale de tous les jardins, le but est la beauté = le nombre maximum de fleurs dans le jardin incomplet * partiel + le nombre de jardins complets * complets. Par conséquent, après avoir trié tous les jardins, l'idée générale est de parcourir toutes les positions, de trouver une position appropriée, de laisser l'avant de celui-ci être des jardins incomplets, et de laisser les plus petites fleurs avoir le plus grand nombre, et de laisser toutes celles qui se trouvent derrière incomplète. C'est un jardin complet, ce qui rend la beauté globale de tous les jardins la plus grande. Il y a beaucoup de détails. J'ai mis les idées de code spécifiques dans les commentaires. Cette version du code devrait être la plus facile à comprendre. J'ai aussi trouvé plusieurs sur le forum. Il existe des solutions, mais elles sont toutes trop obscures.

La complexité temporelle est O(NlogN) et la complexité spatiale est O(N).

La solution du grand gars est facile à comprendre, et je suis aussi plus facile à comprendre avec le diagramme du grand gars : leetcode.com/problems/ma…

répondre

class Solution(object):
    def maximumBeauty(self, flowers, newFlowers, target, full, partial):
        flowers = [min(target, a) for a in flowers]
        # 经过升序排序,目标就变为美丽值=不完整花园最小花朵数的最大值 * partial + 完整花园的个数 * full
        flowers.sort()

        # 如果 flowers 中最小的都大于等于 target ,说明所有的花园现在都是完整的
        if min(flowers) == target: return full * len(flowers)
        # 如果 newFlowers 大于等于将所有的 flowers 都填充为 target 的所需花朵数量
        # 这种情况下直接比较 max(所有的花园都填为完整的美丽值,将花园填充为只有一个不完整花园的美丽值)
        if newFlowers >= target * len(flowers) - sum(flowers):
            return max(full * len(flowers), full * (len(flowers) - 1) + partial * (target - 1))

        # 要想使不完整花园中最大化最小花朵数,就要用花朵填充,使用 cost[i] 计算将前 i 个花园填充为和索引为 i 个花园一样多所需的花朵数
        cost = [0]
        for i in range(1, len(flowers)):
            pre = cost[-1]
            cost.append(pre + i * (flowers[i] - flowers[i - 1]))

        # 因为有些花园已经达到 target 目标,所以我们要缩小花园计算范围
        j = len(flowers) - 1
        while flowers[j] == target:
            j -= 1

        ans = 0
        # 遍历寻找最后的答案
        while newFlowers >= 0:
            # 表示 idx 及其之前的花园都为不完整花园
            idx = min(j, bisect_right(cost, newFlowers) - 1)
            # 将索引 idx 之前的不完整花园都填充和索引为 idx 花园一样的花朵数,并且将剩余的花平均填充到索引为 idx 及其之前的花园中,尽量最大化最小花朵数
            bar = flowers[idx] + (newFlowers - cost[idx]) // (idx + 1)
            # 计算出的美丽值结果与结果值进行比较取较大值
            ans = max(ans, bar * partial + full * (len(flowers) - j - 1))
            # 现在我们假定已经完成了索引为 j 花园的填充,更新 newFlowers 和 j
            newFlowers -= (target - flowers[j])
            j -= 1
        return ans	
复制代码

résultat de l'opération

Runtime: 985 ms, faster than 100.00% of Python online submissions for Maximum Total Beauty of the Gardens.
Memory Usage: 25.2 MB, less than 17.65% of Python online submissions for Maximum Total Beauty of the Gardens.
复制代码

Lien du titre d'origine

leetcode.com/contest/wee…

Votre soutien est ma plus grande motivation

Je suppose que tu aimes

Origine juejin.im/post/7086635873910915103
conseillé
Classement