LeetCode-Python-1052. 爱生气的书店老板

661 篇文章 23 订阅

今天,书店老板有一家店打算试营业 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
            
            
                

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值