คำอธิบายปัญหา
กำหนดลิสต์ piles (จำนวนหินแต่ละกอง) และ k ชั่วโมง ทุกชั่วโมงเลือกกองหนึ่งขุด r หิน (ถ้าน้อยกว่า r ขุดหมดก็ใช้ 1 ชั่วโมง) หา **ค่า r น้อยที่สุด** ที่ขุดหมดทุกกองภายใน ≤ k ชั่วโมง
ตัวอย่าง
piles = [3, 6, 4], k = 5 → Output: 3
r=3: กอง 6 ใช้ 2 ชม., กอง 4 ใช้ 2 ชม., กอง 3 ใช้ 1 ชม. รวม 5 ชม. ✓
ขั้นตอนการแก้ปัญหา (Binary Search)
- ช่วงคำตอบ:
l=1, h=max(piles) - ฟังก์ชัน
turns(r)= ชั่วโมงที่ใช้ =sum(ceil(pile/r) for pile in piles) - Binary search: ถ้า
turns(mid) > k→l = mid+1ไม่งั้นh = mid
การตนการทำงาน (Python)
from math import ceil
def solve(piles, k):
l, h = 1, max(piles)
r = h
def turns(r):
return sum(ceil(b / r) for b in piles)
while l < h:
mid = (l + h) // 2
if turns(mid) > k:
l = mid + 1
else:
h = mid
r = min(r, mid)
return r
piles = [3, 6, 4]
k = 5
print(solve(piles, k)) # Output: 3
อินพุต / เอาต์พุต
Input: [3, 6, 4], 5 Output: 3