โจทย์
ร้านหนังสือเปิด n นาที นาที i มีลูกค้า customers[i] คน
- เจ้าร้านขี้อ้อน (grumpy) นาที
i:grumpy[i]=1→ ลูกค้านั้นไม่พอใจ - เจ้าร้านไม่ขี้อ้อน:
grumpy[i]=0→ ลูกค้าพอใจ - เจ้าร้านมีเทคนิค "ไม่ขี้อ้อน" ใช้ได้ 1 ครั้ง ต่อเนื่อง
Xนาที
หา Maximum satisfied customers
ตัวอย่าง: customers=[1,0,1,2,1,1,7,5], grumpy=[0,1,0,1,0,1,0,1], X=3 → 16 (ใช้เทคนิคนาที 5-7: 1+7+5=13 เพิ่มจาก base)
อัลกอริทึม: Sliding Window + Base Satisfaction
- คำนวณ Base satisfied = ผลรวม
customers[i]ที่grumpy[i]=0(พอใจอยู่แล้ว) - หา Maximum additional satisfied จาก window ขนาด
X:- Window เพิ่มได้เฉพาะนาทีที่
grumpy[i]=1(เพราะ grumpy=0 นับใน base แล้ว) - Sliding window คำนวณ sum ของ
customers[i]ที่grumpy[i]=1ใน window
- Window เพิ่มได้เฉพาะนาทีที่
- Answer = Base + Max additional
การติดตั้ง (Python Implementation)
class Solution:
def maxSatisfied(self, customers: list[int], grumpy: list[int], X: int) -> int:
n = len(customers)
# 1. Base satisfied customers (grumpy=0)
base = sum(c for c, g in zip(customers, grumpy) if g == 0)
# 2. Sliding window for additional satisfied (grumpy=1)
# Initial window [0, X-1]
additional = sum(customers[i] for i in range(X) if grumpy[i] == 1)
max_additional = additional
# Slide window
for i in range(X, n):
# Remove leftmost
if grumpy[i - X] == 1:
additional -= customers[i - X]
# Add new rightmost
if grumpy[i] == 1:
additional += customers[i]
max_additional = max(max_additional, additional)
return base + max_additional
# ทดสอบ
ob = Solution()
print(ob.maxSatisfied([1,0,1,2,1,1,7,5], [0,1,0,1,0,1,0,1], 3)) # 16
print(ob.maxSatisfied([1], [0], 1)) # 1
print(ob.maxSatisfied([4,10,10], [1,1,0], 2)) # 24
Output
16 1 24
การวิเคราะห์ตัวอย่าง
i: 0 1 2 3 4 5 6 7 cust: 1 0 1 2 1 1 7 5 grump: 0 1 0 1 0 1 0 1 Base (grumpy=0): 1 + 1 + 1 + 7 = 10 Window size 3 (grumpy=1 only): [0,1,2]: grumpy=[0,1,0] → add 0 [1,2,3]: grumpy=[1,0,1] → add 0+2=2 [2,3,4]: grumpy=[0,1,0] → add 2 [3,4,5]: grumpy=[1,0,1] → add 2+1=3 [4,5,6]: grumpy=[0,1,0] → add 1 [5,6,7]: grumpy=[1,0,1] → add 1+5=6 ← MAX Total = 10 + 6 = 16 ✓
Complexity
- Time: O(n) - Single pass base + sliding window
- Space: O(1) - Constant extra space
สรุป
Grumpy Bookstore Owner = Sliding Window หา window ขนาด X ที่เพิ่ม satisfied customers มากที่สุด (เฉพาะนาทีที่ grumpy=1) บวกกับ base satisfied customers
หากมีข้อสงสัย สามารถถามได้ในส่วนความคิดเห็นครับ