Cho danh sách nums, kích thước cửa sổ size và số phép toán k. Mỗi phép toán chọn một dãy con liên tiếp độ dài size và tăng tất cả phần tử lên 1. Thực hiện k phép toán, tìm giá trị nhỏ nhất lớn nhất có thể của mảng.
Ví dụ: nums = [2, 5, 2, 2, 7], size = 3, k = 2 → 3.
Quy trình giải quyết (Binary Search + Difference Array)
- Hàm
possible(target)kiểm tra có thể làm tất cả phần tử ≥targetvới ≤kphép toán không:- Dùng mảng
events(difference array) để mô phỏng các phép tăng. - Duyệt mảng, giữ tổng tiền tố
scủaevents. - Nếu
A[i] + s < target, cần tăng thêmdelta, cập nhậtevents[i+size] -= delta. - Tổng phép toán cần ≤
k.
- Dùng mảng
- Binary search trên đáp án từ 0 đến
10^10.
Ví dụ mã nguồn
class Solution:
def solve(self, A, size, K):
N = len(A)
def possible(target):
events = [0] * N
moves = s = 0
for i in range(N):
s += events[i]
delta = target - (A[i] + s)
if delta > 0:
moves += delta
s += delta
if i + size < N:
events[i + size] -= delta
return moves <= K
left, right = 0, 10 ** 10
while left < right:
mid = (left + right + 1) // 2
if possible(mid):
left = mid
else:
right = mid - 1
return left
ob = Solution()
nums = [2, 5, 2, 2, 7]
size = 3
k = 2
print(ob.solve(nums, size, k)) # Output: 3
Đầu vào
[2, 5, 2, 2, 7], 3, 2
Đầu ra
3