1. 程式人生 > 其它 >【Lintcode】1849. Grumpy Bookstore Owner

【Lintcode】1849. Grumpy Bookstore Owner

技術標籤:# 棧、佇列、串及其他資料結構演算法leetcode資料結構

題目地址:

https://www.lintcode.com/problem/grumpy-bookstore-owner/description

給定一個兩個長都是 n n n的陣列 c c c g g g c c c是代表每天顧客的滿意值, g g g代表每天店長是否生氣, 0 0 0代表生氣, 1 1 1代表不生氣。店長不生氣的那天,可以取得滿意值;否則不能取得滿意值。店長可以發動技能,使得連續 X X X天都不生氣,但最多隻能發動一次。問這 n n n天他能得到的滿意值總和最大是多少。

思路是字首和。由於要計算連續 X X

X天的滿意值之和,所以要預處理一下 c c c的字首和陣列 p p p,即 p [ i ] = ∑ c [ 0 : i − 1 ] p[i]=\sum c[0:i-1] p[i]=c[0:i1]。接下來由於要計算連續若干天的店長不生氣的那些滿意值之和,所以還需要預處理一下不生氣字首和陣列,設為 l l l,即 l [ i ] = ∑ g [ . ] = 0 c [ 0 : i − 1 ] l[i]=\sum_{g[.]=0} c[0:i-1] l[i]=g[.]=0c[0:i1]。接下來只要枚舉發動技能的第一天的下標即可。這個下標的取值範圍是 [ 0 : n − X ] [0:n-X] [0:nX],所以相當於要求: max ⁡ i = 0 , 1 , . . . , n − X { l [ i ] + ( p [ i + X ] − p [ i ] ) + ( l [ n ] − l [ i + X ] ) } \max_{i=0,1,...,n-X}\{l[i]+(p[i+X]-p[i])+(l[n]-l[i+X])\}
i=0,1,...,nXmax{l[i]+(p[i+X]p[i])+(l[n]l[i+X])}
程式碼如下:

public class Solution {
    /**
     * @param customers: the number of customers
     * @param grumpy: the owner's temper every day
     * @param X: X days
     * @return: calc the max satisfied customers
     */
    public int maxSatisfied(int[
] customers, int[] grumpy, int X) { // write your code here int n = customers.length; int[] preSum = new int[n + 1], lSum = new int[n + 1]; for (int i = 0; i < n; i++) { preSum[i + 1] = preSum[i] + customers[i]; lSum[i + 1] = lSum[i]; if (grumpy[i] == 0) { lSum[i + 1] += customers[i]; } } // 注意這裡要特判一下X長度大於等於n的情況,這個情況後面是列舉不到的 if (X >= n) { return preSum[n + 1]; } int res = 0; // 開始枚舉發動技能的第一天的下標 for (int i = 0; i <= n - X; i++) { res = Math.max(res, lSum[i] + (preSum[i + X] - preSum[i]) + (lSum[n] - lSum[i + X])); } return res; } }

時空複雜度 O ( n ) O(n) O(n)