Cho danh sách nums và số k. Mỗi phép toán chọn một phần tử và đổi dấu (nhân -1). Phải thực hiện đúng k phép. Tìm tổng lớn nhất có thể đạt được.
Ví dụ: nums = [2, 1, -6, -2], k = 3 → kết quả 9. Đổi dấu -6, -2, 1 → [2, -1, 6, 2], tổng = 9.
Thuật toán giải quyết (Tham lam + Sắp xếp)
- Sắp xếp
numstăng dần - Duyệt từ nhỏ đến lớn: nếu phần tử âm và
k > 0, đổi dấu, giảmk - Sau khi hết số âm hoặc hết
k:- Nếu
klẻ: phải đổi dấu một lần nữa → trừ đi2 * min(nums)từ tổng - Nếu
kchẵn: đổi dấu cặp nhau không thay đổi tổng
- Nếu
- Trả về tổng
Ví dụ minh họa
def solve(nums, k):
n = len(nums)
if n == 0:
return 0
nums.sort()
for idx in range(n):
if nums[idx] < 0 and k > 0:
k -= 1
nums[idx] *= -1
if k & 1 == 1:
return sum(nums) - 2 * min(nums)
return sum(nums)
nums = [2, 1, -6, -2]
k = 3
print(solve(nums, k))
Đầu vào
[2, 1, -6, -2], 3
Đầu ra
9