Python 中的暴躁书店老板


假设一位书店老板开店一段时间(以客户列表条目分钟数表示)。每分钟,都会有若干顾客(customers[i])进入商店,然后在该分钟结束时离开。在某些分钟,老板脾气暴躁。现在,如果老板在第 i 分钟脾气暴躁,则 grumpy[i] = 1,否则 grumpy[i] = 0。当书店老板脾气暴躁时,该分钟的顾客不开心,否则他们很开心。书店老板知道一种方法可以让自己连续 X 分钟不发脾气。这种方法不能使用超过一次。我们必须找到一天中可以开心的顾客的最大数量。因此,如果输入类似于:customers = [1,0,1,2,1,1,7,5] 和 grumpy = [0,1,0,1,0,1] 以及 X = 3,则输出将为 16。这是因为老板在最后三分钟不会让自己发脾气。因此,最开心的顾客数量为 1 + 1 + 1 + 1 + 7 + 5 = 16

为了解决这个问题,我们将遵循以下步骤:

  • 设置 i := 0,j := 0,sums := 空列表,temp := 0

  • 当 j – i + 1 < X 时

    • 如果 grumpy[j] 为 1,则 temp := temp + customers[j]

    • 将 j 增加 1

  • 将列表 [temp, i, j] 插入 sums 数组中

  • 将 i 和 j 增加 1

  • 当 j < 客户列表的长度时

    • 如果 grumpy[i - 1] 为 1,则 temp := temp – customers[i - 1]

    • 如果 grumpy[j] 为 1,则 temp := temp + customer[j]

    • 将列表 [temp, i, j] 插入 sums 数组中

    • 将 i 和 j 增加 1

  • sums := 基于内部列表的第一个元素对 sums 数组进行排序

  • index1 := sums 中最后一个列表的第二个元素,index2 := sums 中最后一个列表的第三个元素,

  • 对于 index1 到 index2 范围内的 i,设置 grumpy[i] := 0

  • ans := 0

  • 对于 0 到 customers 长度范围内的 i

    • 如果 grumpy[i] 为 0,则 ans := ans + customers[i]

  • 返回 ans

让我们看看以下实现,以便更好地理解:

示例

 实时演示

class Solution(object):
   def maxSatisfied(self, customers, grumpy, X):
      i = 0
      j = 0
      sums = []
      temp = 0
      while j-i+1<X:
         if grumpy[j]:
            temp+=customers[j]
         j+=1
      sums.append([temp,i,j])
      i+=1
      j+=1
      while j<len(customers):
         if grumpy[i-1]:
            temp-=customers[i-1]
         if grumpy[j]:
            temp+=customers[j]
         sums.append([temp,i,j])
         i+=1
         j+=1
      sums =sorted(sums,key = lambda v : v[0])
      index1 = sums[-1][1]
      index2 = sums[-1][2]
      for i in range(index1,index2+1):
         grumpy[i] = 0
      ans = 0
      for i in range(len(customers)):
         if not grumpy[i]:
            ans+=customers[i]
      return ans
ob = Solution()
print(ob.maxSatisfied([1,0,1,2,1,1,7,5],[0,1,0,1,0,1,0,1],3))

输入

[1,0,1,2,1,1,7,5]
[0,1,0,1,0,1,0,1]
3

输出

16

更新于:2020年5月2日

170 次查看

开启你的 职业生涯

通过完成课程获得认证

开始
广告

© . All rights reserved.