返回介绍

solution / 2200-2299 / 2226.Maximum Candies Allocated to K Children / README

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

2226. 每个小孩最多能分到多少糖果

English Version

题目描述

给你一个 下标从 0 开始 的整数数组 candies 。数组中的每个元素表示大小为 candies[i] 的一堆糖果。你可以将每堆糖果分成任意数量的 子堆 ,但 无法 再将两堆合并到一起。

另给你一个整数 k 。你需要将这些糖果分配给 k 个小孩,使每个小孩分到 相同 数量的糖果。每个小孩可以拿走 至多一堆 糖果,有些糖果可能会不被分配。

返回每个小孩可以拿走的 最大糖果数目_ _。

 

示例 1:

输入:candies = [5,8,6], k = 3
输出:5
解释:可以将 candies[1] 分成大小分别为 5 和 3 的两堆,然后把 candies[2] 分成大小分别为 5 和 1 的两堆。现在就有五堆大小分别为 5、5、3、5 和 1 的糖果。可以把 3 堆大小为 5 的糖果分给 3 个小孩。可以证明无法让每个小孩得到超过 5 颗糖果。

示例 2:

输入:candies = [2,5], k = 11
输出:0
解释:总共有 11 个小孩,但只有 7 颗糖果,但如果要分配糖果的话,必须保证每个小孩至少能得到 1 颗糖果。因此,最后每个小孩都没有得到糖果,答案是 0 。

 

提示:

  • 1 <= candies.length <= 105
  • 1 <= candies[i] <= 107
  • 1 <= k <= 1012

解法

方法一:二分查找

时间复杂度 $O(nlogn)$。

class Solution:
  def maximumCandies(self, candies: List[int], k: int) -> int:
    left, right = 0, max(candies)
    while left < right:
      mid = (left + right + 1) >> 1
      cnt = sum(v // mid for v in candies)
      if cnt >= k:
        left = mid
      else:
        right = mid - 1
    return left
class Solution {
  public int maximumCandies(int[] candies, long k) {
    int left = 0, right = (int) 1e7;
    while (left < right) {
      int mid = (left + right + 1) >> 1;
      long cnt = 0;
      for (int v : candies) {
        cnt += v / mid;
      }
      if (cnt >= k) {
        left = mid;
      } else {
        right = mid - 1;
      }
    }
    return left;
  }
}
class Solution {
public:
  int maximumCandies(vector<int>& candies, long long k) {
    int left = 0, right = 1e7;
    while (left < right) {
      int mid = (left + right + 1) >> 1;
      long long cnt = 0;
      for (int& v : candies) cnt += v / mid;
      if (cnt >= k)
        left = mid;
      else
        right = mid - 1;
    }
    return left;
  }
};
func maximumCandies(candies []int, k int64) int {
  left, right := 0, int(1e7)
  for left < right {
    mid := (left + right + 1) >> 1
    var cnt int64
    for _, v := range candies {
      cnt += int64(v / mid)
    }
    if cnt >= k {
      left = mid
    } else {
      right = mid - 1
    }
  }
  return left
}

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

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

发布评论

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