Cho mảng pos vị trí các thùng trên đường thẳng và x quả bóng. Lực giữa 2 bóng tại p, q là |p-q|. Đặt x bóng vào các vị trí trong pos để tối đa hóa lực hút tối thiểu giữa 2 bóng bất kỳ.
Ví dụ: pos=[2,4,6,8,10,12], x=3 → 4. Đặt tại 4,8,12 → lực min = 4.
Giải thuật (Binary Search + Tham lam)
- Sắp xếp
pos. - Hàm
ball_count(d): số bóng đặt được nếu lực min ≥d(tham lam: đặt bóng đầu tạipos[0], các bóng sau tại vị trí đầu tiên ≥curr + d). - Binary search
left=0,right=pos[-1]-pos[0]:mid = right - (right-left)//2(upper mid).- Nếu
ball_count(mid) >= x:left = mid; ngược lại:right = mid-1.
- Trả về
left.
Ví dụ minh họa
def solve(pos, x):
n = len(pos)
pos.sort()
def ball_count(d):
ans, curr = 1, pos[0]
for i in range(1, n):
if pos[i] - curr >= d:
ans += 1
curr = pos[i]
return ans
left, right = 0, pos[-1] - pos[0]
while left < right:
mid = right - (right - left) // 2
if ball_count(mid) >= x:
left = mid
else:
right = mid - 1
return left
print(solve([2, 4, 6, 8, 10, 12], 3))
Đầu vào
[2, 4, 6, 8, 10, 12], 3
Đầu ra
4