美文网首页快乐写代码
T1052、爱生气的书店老板

T1052、爱生气的书店老板

作者: 上行彩虹人 | 来源:发表于2020-08-26 19:35 被阅读0次

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

    temp数组的值为customers和grumpy对应值得乘积,表示该时间生气值的损失。所以问题转化为求temp数组K宽口内的最大子序列。

      public int maxSatisfied(int[] customers, int[] grumpy, int X) {
            int res = 0;
            if(customers == null || grumpy == null)
                return 0;
            if(customers.length == 1)
                if(X >= 1)
                    return customers[0];
                else
                    return customers[0] * (1 - grumpy[0]);
            int[] temp = new int[customers.length];
            for(int i = 0; i < customers.length; i++){
                temp[i] = customers[i] * grumpy[i];
            }
            int i = 0, j = 0;
            int max = 0;
            while(j < X){
                max += temp[j];
                j++;
            }
                
            int l = i, r = j-1;
            int t = max; //记录窗口的值
            while(j < customers.length){
                t = t - temp[i] + temp[j];
                if(t > max){
                    max = t;
                    l = i+1;
                    r = j;
                }
                i++; j++;
            }
            while(l <= r){
                grumpy[l] = 0;
                l++;
            }
            for(int p = 0; p < customers.length; p++)
                if(grumpy[p] == 0)
                    res += customers[p];
            
            return res;
        }
    

    相关文章

      网友评论

        本文标题:T1052、爱生气的书店老板

        本文链接:https://www.haomeiwen.com/subject/qimfsktx.html