返回

巧妙分配饼干:满足更多孩子的胃口

闲谈

如何公平地分发饼干?

分发饼干是一项艰巨的任务,尤其是当每个孩子都有不同的胃口,而每块饼干也有不同的尺寸时。目标是让尽可能多的孩子得到满足,即为他们提供至少和他们胃口同样大小的饼干。

考虑以下场景:有三个孩子,他们的胃口值分别为 1、2 和 3。有四块饼干,尺寸分别为 2、1、3 和 2。我们如何分配这些饼干才能满足尽可能多的孩子?

一种方法是先满足胃口最小的孩子。我们先把尺寸为 1 的饼干给胃口为 1 的孩子。现在,我们还有三个孩子和三块饼干。

下一步,我们给胃口为 2 的孩子分配一块尺寸为 2 的饼干。现在,我们只剩下两个孩子和两块饼干。

最后,我们给胃口为 3 的孩子分配尺寸为 3 的饼干。现在,所有的孩子都得到满足了。

通过这种方式,我们满足了三个孩子中的两个,即最大数量的孩子。

算法:

  1. 对孩子的胃口值和饼干的尺寸进行排序。 这将确保我们首先为胃口最小的孩子分配最小尺寸的饼干。
  2. 逐一分配饼干。 对于每个孩子,从尺寸最小的饼干开始,直到找到一块尺寸大于或等于其胃口的饼干。
  3. 统计得到满足的孩子数量。

复杂度:

该算法的时间复杂度为 O(n log n),其中 n 是孩子和饼干的数量。排序的复杂度为 O(n log n),分配饼干的复杂度为 O(n)。

示例实现:

def distribute_cookies(kids, cookies):
  """
  :param kids: list of kids' stomach sizes
  :param cookies: list of cookie sizes
  :return: the maximum number of satisfied kids
  """

  # Sort the stomach sizes and cookie sizes
  kids.sort()
  cookies.sort()

  # Initialize the number of satisfied kids
  satisfied = 0

  # Iterate over the kids and cookies
  i, j = 0, 0
  while i < len(kids) and j < len(cookies):
    # If the cookie is big enough, give it to the kid
    if cookies[j] >= kids[i]:
      satisfied += 1
      i += 1  # Move to the next kid
    j += 1  # Move to the next cookie

  # Return the number of satisfied kids
  return satisfied

通过遵循这些步骤,我们可以公平地分发饼干,并最大程度地满足孩子的胃口。