今天,书店老板有一家店打算试营业 customers.length
分钟。每分钟都有一些顾客(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,0,1], X = 3 输出:16 解释: 书店老板在最后 3 分钟保持冷静。 感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
提示:
1 <= X <= customers.length == grumpy.length <= 20000
0 <= customers[i] <= 1000
0 <= grumpy[i] <= 1
思路:
看到了位置可选的长度为X的一个区间,马上要想到sliding window。
先计算一下假设没有这个不生气BUFF时候每一个长度为X的区间上,可以让多少顾客满意,值为angsum。
再计算有了这个不生气BUFF,在每一个长度为X的区间上,有多少顾客满意,值为presum。
所以对于每个区间,因为这个BUFF而新增的满意顾客数就是presum - angsum,求这个值的最大值即可。
区间和的计算可以用前缀和数组加快计算速度。
class Solution(object):
def maxSatisfied(self, customers, grumpy, X):
"""
:type customers: List[int]
:type grumpy: List[int]
:type X: int
:rtype: int
"""
record = [0 for _ in range(len(grumpy))] #代表在i满意的顾客总数
s = 0
for i in range(len(grumpy)):
if grumpy[i] == 0:
record[i] += record[i - 1] + customers[i]
else:
record[i] += record[i - 1]
print record
tmp = record[-1]#不生气的时候已经可以满足的
prefix = [0 for _ in range(len(grumpy))]
prefix[0] = customers[0]
for i in range(1, len(grumpy)):
prefix[i] += prefix[i - 1] + customers[i]
lo, hi = 0, X - 1
newcus = 0
# print prefix
while(hi < len(grumpy)):
if lo == 0:
presum = prefix[hi] - 0 #上了BUFF之后的
angsum = record[hi] - 0 #没上BUFF
else:
presum = prefix[hi] - prefix[lo - 1]
angsum = record[hi] - record[lo - 1]
earn = presum - angsum
# print presum, angsum, earn, hi
newcus = max(presum - angsum, newcus)
hi += 1
lo += 1
return tmp + newcus