Cho mảng nums với nums[i] là số quả bóng trong túi thứ i. Cho thêm giá trị mx — số phép chia tối đa. Mỗi phép chia: chọn một túi, tách thành hai túi mới (mỗi túi ít nhất 1 quả). "Phạt" (penalty) là số quả bóng lớn nhất trong một túi sau các phép chia. Mục tiêu: tối thiểu hóa penalty.
Ví dụ: nums = [4,8,16,4], mx = 4 → kết quả 4. Các bước: [4,8,16,4] → tách 16 → [4,8,8,8,4] → tách các 8 → [4,4,4,4,4,4,4,4]. Penalty = 4.
Giải thuật (Tìm kiếm nhị phân)
- Hàm
helper(target, mx): trả vềTruenếu có thể đạt penalty ≤targetvới ≤mxphép chia.- Nếu
target == 0: trả vềmx + 1. - Đếm tổng số phép chia cần:
sum((num - 1) // target for num in nums). - Trả về
count <= mx.
- Nếu
- Chương trình chính:
left := max(sum(nums) // (len(nums) + mx), 1).right := max(nums).- Trong khi
left < right:mid := (left + right) // 2.- Nếu
helper(mid, mx):right := mid. - Ngược lại:
left := mid + 1.
- Trả về
left.
Ví dụ minh họa
def helper(target, mx):
if target == 0:
return mx + 1
count = 0
for num in nums:
count += (num - 1) // target
return count <= mx
def solve(nums, mx):
left, right = max(sum(nums) // (len(nums) + mx), 1), max(nums)
while left < right:
mid = (left + right) // 2
if helper(mid, mx):
right = mid
else:
left = mid + 1
return left
nums = [4,8,16,4]
mx = 4
print(solve(nums, mx))
Đầu vào
[4,8,16,4], 4
Đầu ra
4