Mảng nums độ dài chẵn, giá trị 1..limit. Mảng bổ sung (complementary) nếu nums[i] + nums[n-1-i] bằng hằng số cho mọi i. Mỗi phép: thay 1 phần tử bằng giá trị 1..limit. Tìm số phép nhỏ nhất.
Ví dụ: nums=[1,4,2,3], limit=4 → 1. Đổi nums[1]=4→2: [1,2,2,3], các cặp tổng = 4.
Giải thuật (Sweep line / Mảng hiệu)
n = len(nums),mid = n//2.zero_moves[sum]= số cặp đã có tổng = sum.- Mảng
start,endkích thước2*limit+1đánh dấu khoảng tổng có thể đạt được với 1 phép thay đổi. - Với mỗi cặp
(x, y):zero_moves[x+y]++.start[min(x,y)+1]++,end[max(x,y)+limit]++.
- Duyệt
targettừ 2 đến2*limit, tính chi phí =2*(mid-intervals) + intervals - zero_moves[target], cập nhật min.
Ví dụ minh họa
from collections import defaultdict
def solve(nums, limit):
n = len(nums)
mid = n // 2
zero_moves = defaultdict(int)
start = [0] * (2 * limit + 1)
end = [0] * (2 * limit + 1)
res = float('inf')
for i in range(mid):
x, y = nums[i], nums[n - 1 - i]
zero_moves[x + y] += 1
start[min(x, y) + 1] += 1
end[max(x, y) + limit] += 1
intervals = 0
for target in range(2, limit * 2 + 1):
intervals += start[target]
cost = 2 * (mid - intervals) + intervals - zero_moves[target]
res = min(res, cost)
intervals -= end[target]
return res
nums = [1,4,2,3]
limit = 4
print(solve(nums, limit))
Đầu vào
[1,4,2,3], 4
Đầu ra
1