使用Python查找袋子中球的最小数量限制

使用Python查找袋子中球的最小数量限制

假设我们有一个数组nums,其中第i个元素表示包含nums [i]个球的袋子。我们还有一个名为mx的值。我们最多可以执行mx次以下操作−

  • 选择任何一个球袋,并将其分成两个新的球袋,每个球袋至少有一个球。

  • 这里惩罚是球袋内球的最大数量。

我们必须最小化操作后的惩罚。因此,最后,我们必须找到执行操作后可能的最小惩罚。

因此,如果输入如下:nums = [4,8,16,4],mx = 4,则输出将是4,因为我们可以执行以下操作:最初我们有一个袋子[4,8,16,4],将16个球的袋子分裂成[4,8,8,8,4],对于每个有8个球的袋子,将它们分成两个每个4个球的球袋,因此数组将变为[4,4,4,8,8,4],然后[4,4,4,4,4,8,4],最后[4,4,4,4,4,4,4,4],所以这里最少我们有4个球,即惩罚。

为了解决这个问题,我们将采取以下步骤−

  • 定义一个帮助函数helper()。这将获取target、mx

  • 如果目标与0相同,则

    • 返回mx + 1
  • 计数:=0

  • 对于nums中的每个数字,执行以下操作

    • 计数 := count + (num – 1) / target的商
  • 返回计数≤mx

  • 从主方法中执行以下操作

  • left:=(nums所有元素之和/(nums大小+mx)的商和1的最大值)

  • right:= nums的最大值

  • while left

    • mid :=(left + right)/ 2的商

    • 如果helper(mid,mx)不为零,则

      • right := mid
    • 否则,
      • left := mid + 1
  • 返回left

样例

让我们看一下以下实现,以获得更好的理解−

def helper(target, mx):
   if target == 0:
      return mx + 1
   count = 0
   for num in nums:
      count += (num - 1) // target
   return count <= mx

def solve(nums, mx):
   left, right = max(sum(nums) // (len(nums) + mx), 1), max(nums)
   while left < right:
      mid = (left + right) // 2
      if helper(mid, mx):
         right = mid
      else:
         left = mid + 1
   return left

nums = [4,8,16,4]
mx = 4
print(solve(nums, mx))

输入

[4,8,16,4], 4

输出

4

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程