返回介绍

solution / 2200-2299 / 2234.Maximum Total Beauty of the Gardens / README_EN

发布于 2024-06-17 01:03:08 字数 8982 浏览 0 评论 0 收藏 0

2234. Maximum Total Beauty of the Gardens

中文文档

Description

Alice is a caretaker of n gardens and she wants to plant flowers to maximize the total beauty of all her gardens.

You are given a 0-indexed integer array flowers of size n, where flowers[i] is the number of flowers already planted in the ith garden. Flowers that are already planted cannot be removed. You are then given another integer newFlowers, which is the maximum number of flowers that Alice can additionally plant. You are also given the integers target, full, and partial.

A garden is considered complete if it has at least target flowers. The total beauty of the gardens is then determined as the sum of the following:

  • The number of complete gardens multiplied by full.
  • The minimum number of flowers in any of the incomplete gardens multiplied by partial. If there are no incomplete gardens, then this value will be 0.

Return _the maximum total beauty that Alice can obtain after planting at most _newFlowers_ flowers._

 

Example 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.

Example 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.

 

Constraints:

  • 1 <= flowers.length <= 105
  • 1 <= flowers[i], target <= 105
  • 1 <= newFlowers <= 1010
  • 1 <= full, partial <= 105

Solutions

Solution 1

class Solution:
  def maximumBeauty(
    self, flowers: List[int], newFlowers: int, target: int, full: int, partial: int
  ) -> int:
    flowers.sort()
    n = len(flowers)
    s = list(accumulate(flowers, initial=0))
    ans, i = 0, n - bisect_left(flowers, target)
    for x in range(i, n + 1):
      newFlowers -= 0 if x == 0 else max(target - flowers[n - x], 0)
      if newFlowers < 0:
        break
      l, r = 0, n - x - 1
      while l < r:
        mid = (l + r + 1) >> 1
        if flowers[mid] * (mid + 1) - s[mid + 1] <= newFlowers:
          l = mid
        else:
          r = mid - 1
      y = 0
      if r != -1:
        cost = flowers[l] * (l + 1) - s[l + 1]
        y = min(flowers[l] + (newFlowers - cost) // (l + 1), target - 1)
      ans = max(ans, x * full + y * partial)
    return ans
class Solution {
  public long maximumBeauty(int[] flowers, long newFlowers, int target, int full, int partial) {
    Arrays.sort(flowers);
    int n = flowers.length;
    long[] s = new long[n + 1];
    for (int i = 0; i < n; ++i) {
      s[i + 1] = s[i] + flowers[i];
    }
    long ans = 0;
    int x = 0;
    for (int v : flowers) {
      if (v >= target) {
        ++x;
      }
    }
    for (; x <= n; ++x) {
      newFlowers -= (x == 0 ? 0 : Math.max(target - flowers[n - x], 0));
      if (newFlowers < 0) {
        break;
      }
      int l = 0, r = n - x - 1;
      while (l < r) {
        int mid = (l + r + 1) >> 1;
        if ((long) flowers[mid] * (mid + 1) - s[mid + 1] <= newFlowers) {
          l = mid;
        } else {
          r = mid - 1;
        }
      }
      long y = 0;
      if (r != -1) {
        long cost = (long) flowers[l] * (l + 1) - s[l + 1];
        y = Math.min(flowers[l] + (newFlowers - cost) / (l + 1), target - 1);
      }
      ans = Math.max(ans, (long) x * full + y * partial);
    }
    return ans;
  }
}
class Solution {
public:
  long long maximumBeauty(vector<int>& flowers, long long newFlowers, int target, int full, int partial) {
    sort(flowers.begin(), flowers.end());
    int n = flowers.size();
    long long s[n + 1];
    s[0] = 0;
    for (int i = 1; i <= n; ++i) {
      s[i] = s[i - 1] + flowers[i - 1];
    }
    long long ans = 0;
    int i = flowers.end() - lower_bound(flowers.begin(), flowers.end(), target);
    for (int x = i; x <= n; ++x) {
      newFlowers -= (x == 0 ? 0 : max(target - flowers[n - x], 0));
      if (newFlowers < 0) {
        break;
      }
      int l = 0, r = n - x - 1;
      while (l < r) {
        int mid = (l + r + 1) >> 1;
        if (1LL * flowers[mid] * (mid + 1) - s[mid + 1] <= newFlowers) {
          l = mid;
        } else {
          r = mid - 1;
        }
      }
      int y = 0;
      if (r != -1) {
        long long cost = 1LL * flowers[l] * (l + 1) - s[l + 1];
        long long mx = flowers[l] + (newFlowers - cost) / (l + 1);
        long long threshold = target - 1;
        y = min(mx, threshold);
      }
      ans = max(ans, 1LL * x * full + 1LL * y * partial);
    }
    return ans;
  }
};
func maximumBeauty(flowers []int, newFlowers int64, target int, full int, partial int) int64 {
  sort.Ints(flowers)
  n := len(flowers)
  s := make([]int, n+1)
  for i, x := range flowers {
    s[i+1] = s[i] + x
  }
  ans := 0
  i := n - sort.SearchInts(flowers, target)
  for x := i; x <= n; x++ {
    if x > 0 {
      newFlowers -= int64(max(target-flowers[n-x], 0))
    }
    if newFlowers < 0 {
      break
    }
    l, r := 0, n-x-1
    for l < r {
      mid := (l + r + 1) >> 1
      if int64(flowers[mid]*(mid+1)-s[mid+1]) <= newFlowers {
        l = mid
      } else {
        r = mid - 1
      }
    }
    y := 0
    if r != -1 {
      cost := flowers[l]*(l+1) - s[l+1]
      y = min(flowers[l]+int((newFlowers-int64(cost))/int64(l+1)), target-1)
    }
    ans = max(ans, x*full+y*partial)
  }
  return int64(ans)
}
function maximumBeauty(
  flowers: number[],
  newFlowers: number,
  target: number,
  full: number,
  partial: number,
): number {
  flowers.sort((a, b) => a - b);
  const n = flowers.length;
  const s: number[] = Array(n + 1).fill(0);
  for (let i = 1; i <= n; i++) {
    s[i] = s[i - 1] + flowers[i - 1];
  }
  let x = flowers.filter(f => f >= target).length;
  let ans = 0;
  for (; x <= n; ++x) {
    newFlowers -= x === 0 ? 0 : Math.max(target - flowers[n - x], 0);
    if (newFlowers < 0) {
      break;
    }
    let l = 0;
    let r = n - x - 1;
    while (l < r) {
      const mid = (l + r + 1) >> 1;
      if (flowers[mid] * (mid + 1) - s[mid + 1] <= newFlowers) {
        l = mid;
      } else {
        r = mid - 1;
      }
    }
    let y = 0;
    if (r !== -1) {
      const cost = flowers[l] * (l + 1) - s[l + 1];
      y = Math.min(flowers[l] + Math.floor((newFlowers - cost) / (l + 1)), target - 1);
    }
    ans = Math.max(ans, x * full + y * partial);
  }
  return ans;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文