力扣第1052题——赶走顾客的老板

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/grumpy-bookstore-owner
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes) {
        int n=customers.size();
        int i,cur_ang=0,max_ang,org_cus=0;
        for(i=0;i<n;i++){
            if(grumpy[i]!=1){			//本来就不会被赶走的数目
                org_cus+=customers[i];
            }
        }
        for(i=0;i<minutes;i++){		//第一个窗口
            cur_ang+=grumpy[i]*customers[i];
        }
        max_ang=cur_ang;
        for(i=minutes;i<n;i++){		//算出每个窗口会被赶走的顾客的数目,并更新最大值
            cur_ang+=customers[i]*grumpy[i];		//窗口往后滑,加入第i个新元素
            cur_ang-=customers[i-minutes]*grumpy[i-minutes];		//窗口往后划,要使窗口大小不变,就要剪掉第一个元素(最左边的)
            max_ang=max(max_ang,cur_ang);		//更新最大值
        }
        return max_ang+org_cus;		//结果就是本来就不会被赶走的数目加上老板发动技能期间,让本来要被赶走的顾客留下来最多的数目
    }
};

解释:
给出两个数组,分别是一分钟的顾客数(一个数组元素就是一分钟),以及在这一分钟的时候老板是否生气,老板生气grumpy为1,这时候老板会赶人走。然后老天赋予老板一项技让他能可以在一段时间(几分钟或者说几个元素grumpy会为0)内不生气,顾客就不会被赶走了。要找出不被赶走顾客的顾客最多的数目(即老板不生气的时间按段内顾客最多)。

这个一段时间相当于一个窗口,这个窗口会滑动,当这个窗口内老板生气(grumpy[i])时顾客数最多,那就让老板这段时间发动不生气技能,使得足够多的顾客不会被赶走(让他们满意)。

我们算出老板本来就不生气时顾客的数目,然后加上老板发动技能那段时间被赶走的顾客最多的数目的窗口,这就是最大的数目。

要算老板在哪段时间发动技能就要用滑动窗口,算出当前值,然后保留最大值。这个窗口从前minutes个开始,先算出前0——minutes-1这段时间被赶走的顾客数。在从1——minutes开始往后循环,第一次加进来了minutes个,就要把第0个删掉(i-minutes),这样一直更新,这个cur_ang就是老板在一段固定时间内会被赶走的顾客数。每往后滑一位(i++)就要把这个窗口之前的第一位(i-minutes)拿掉。最终算出某段时间被赶走的顾客数最多,再加上原来不被赶走的就是结果(能使顾客满意最多的数目)

在某段时间老板生气赶走的顾客数最多的那段就让老板发动不生气技能,把这些数目最大的顾客留下来。

ps:第一次写,可能写的不好,写的有点啰嗦,还请多多包涵,感谢您的阅读!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值