website/content.en/ChapterFour/1000~1099/1052.Grumpy-Bookstore-Owner.md
Today, the bookstore owner has a store open for customers.lengthminutes. Every minute, some number of customers (customers[i]) enter the store, and all those customers leave after the end of that minute.
On some minutes, the bookstore owner is grumpy. If the bookstore owner is grumpy on the i-th minute, grumpy[i] = 1, otherwise grumpy[i] = 0. When the bookstore owner is grumpy, the customers of that minute are not satisfied, otherwise they are satisfied.
The bookstore owner knows a secret technique to keep themselves not grumpy for X minutes straight, but can only use it once.
Return the maximum number of customers that can be satisfied throughout the day.
Example 1:
Input: customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3
Output: 16
Explanation: The bookstore owner keeps themselves not grumpy for the last 3 minutes.
The maximum number of customers that can be satisfied = 1 + 1 + 1 + 1 + 7 + 5 = 16.
Note:
1 <= X <= customers.length == grumpy.length <= 200000 <= customers[i] <= 10000 <= grumpy[i] <= 1Today, the bookstore owner has a store that plans to be open for a trial run for customers.length minutes. Every minute, some customers (customers[i]) enter the bookstore, and all these customers leave after that minute ends. At certain times, the bookstore owner gets angry. If the bookstore owner is angry during the i-th minute, then grumpy[i] = 1; otherwise grumpy[i] = 0. When the bookstore owner is angry, the customers during that minute are dissatisfied; when not angry, they are satisfied. The bookstore owner knows a secret technique that can suppress their emotions, allowing them to not be angry for X consecutive minutes, but it can only be used once. Please return the maximum number of customers who can be satisfied over the course of the day.
Note:
customer0 specifically to record and accumulate the values corresponding to 0s in the temper array. No matter how it changes, 0s will always remain 0s; the only change is that 1s become 0s. Use customer1 specifically to record the values corresponding to 1s in the temper array. Find the maximum value of customer1 during the window sliding process. The final required maximum value is customer0 + maxCustomer1.
package leetcode
// Solution 1: optimized sliding window version
func maxSatisfied(customers []int, grumpy []int, X int) int {
customer0, customer1, maxCustomer1, left, right := 0, 0, 0, 0, 0
for ; right < len(customers); right++ {
if grumpy[right] == 0 {
customer0 += customers[right]
} else {
customer1 += customers[right]
for right-left+1 > X {
if grumpy[left] == 1 {
customer1 -= customers[left]
}
left++
}
if customer1 > maxCustomer1 {
maxCustomer1 = customer1
}
}
}
return maxCustomer1 + customer0
}
// Solution 2: brute-force sliding window version
func maxSatisfied1(customers []int, grumpy []int, X int) int {
left, right, res := 0, -1, 0
for left < len(customers) {
if right+1 < len(customers) && right-left < X-1 {
right++
} else {
if right-left+1 == X {
res = max(res, sumSatisfied(customers, grumpy, left, right))
}
left++
}
}
return res
}
func sumSatisfied(customers []int, grumpy []int, start, end int) int {
sum := 0
for i := 0; i < len(customers); i++ {
if i < start || i > end {
if grumpy[i] == 0 {
sum += customers[i]
}
} else {
sum += customers[i]
}
}
return sum
}