力扣1052. 愛生氣的書店老闆-C語言實現-中等難度

清瀨灰二發表於2021-02-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

來源:力扣(LeetCode)

模板

int maxSatisfied(int* customers, int customersSize, int* grumpy, int grumpySize, int X){

}

解題

分析

本題可以使用滑動視窗
總體思路如下

首先統計老闆不控制自己情緒的情況下會滿意的客戶的總人數

   for (int i = 0; i < customersSize; i++) if (grumpy[i] == 0) total += customers[i];

再加入老闆控制情緒,長度為X,自前向後滑動這個X視窗

 for (int i = 0; i < X; i++) add += customers[i] * grumpy[i];

已知生氣時狀態為1,我們控制情緒之後就會將這部分的人留下,所以可以理解為

customer[i]*grupy[i]

而本身據不生氣的時候狀態為0的情況已經在第一步統計進去了
往後滑動的過程中,我們需要減去前面的,增加後面的

   for (int i = X; i < customersSize; i++) 
   add = add - customers[i - X] * grumpy[i - X] + customers[i] * grumpy[i];

原始碼

int maxSatisfied(int* customers, int customersSize, int* grumpy, int grumpySize, int X) {
    int total = 0;
    int n = customersSize;
    for (int i = 0; i < customersSize; i++) 
        if (grumpy[i] == 0) 
        	total += customers[i];
    int add = 0;
    for (int i = 0; i < X; i++) 
        add += customers[i] * grumpy[i];
    int maxAdd = add;
    for (int i = X; i < customersSize; i++) {
        add = add - customers[i - X] * grumpy[i - X] + customers[i] * grumpy[i];
        maxAdd = fmax(maxAdd, add);
    }
    return total + maxAdd;
}

執行結果

在這裡插入圖片描述

相關文章