用Python编写程序查找使m束花所需的最少天数

用Python编写程序查找使m束花所需的最少天数

假设我们有一个名为nums的整数数组,我们还有另外两个值m和k。现在,我们需要制作m束花。为了制作一束花,我们需要从花园中选择k朵相邻的花朵。这里的花园由n种不同的花组成,第i朵花将在第bloomDay [ i ]天开放。每朵花只能在一束花中使用。我们必须找到等待制作m束花所需的最少天数。如果我们无法制作m束花,则返回-1。

因此,如果输入为bloomDay=[5,5,5,5,10,5,5],m=2,k=3,则输出将为10,因为我们需要2束花(m=2),每束花应该有3朵花。

  • 在第5天之后:[x,x,x,x,_,x,x],我们可以制作第一批开放的前三朵花的一束花,但是无法再制作另一束花

  • 在第10天之后:[x,x,x,x,x,x,x],现在我们可以用不同的方式制作两束花。

要解决问题,我们将遵循以下步骤−

  • n := bloomDay的大小

  • 如果m * k >n,则

    • 返回-1
  • 定义一个函数possible()。这将采用x

  • count=0,bouquets=0

  • 对于bloomDay中的每个d,执行以下操作−

    • 如果d≤x,则
      • count=count+1

      • 如果计数与k相同,则

      • bouquets=bouquets+1

      • count=0

    • 否则,

      • 计数=0
  • 如果bouquets≥m,则返回true,否则返回false

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

  • 左:=0,右:=1 + bloomDay的最大值

  • while left

    • mid:=(左+右)/ 2

    • 如果possible(mid)为true,则

      • right:=mid
    • 否则,
      • left:=mid + 1
  • 如果possible(left)为true,则
    • 返回left
  • 否则返回left + 1

让我们看下面的实现,以便更好地理解−

示例

def solve(bloomDay, m, k):
   n = len(bloomDay)
   if m * k > n:
      return -1
   def possible(x):
      count = 0
      bouquets = 0
      for d in bloomDay:
          if d ≤ x:
             count += 1
             if count == k:
                bouquets += 1
                count = 0
          else:
             count = 0
      return bouquets ≥ m
   left, right = 0, max(bloomDay) + 1
   while left < right:
      mid = (left + right)//2
      if possible(mid):
         right = mid
      else:
         left = mid + 1
   if possible(left):
      return left
   else:
      return left + 1
bloomDay = [5,5,5,5,10,5,5]
m = 2
k = 3
print(solve(bloomDay, m, k))

输入

[5,5,5,5,10,5,5], 2, 3

输出

10

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程