Đề bài
Cho mảng kích thước (2n-1). Mỗi phép toán chọn chính xác n phần tử và đổi dấu (nhân -1). Lặp lại phép toán bất kỳ số lần. Tìm tổng lớn nhất có thể.
Ví dụ: {-2,100,-3}, n=2. Đổi dấu -2 và -3 → {2,100,3}, tổng=105.
Thuật toán
- Đếm số phần tử âm (
negCnt). - Tính tổng giá trị tuyệt đối (
sum). - Tìm giá trị tuyệt đối nhỏ nhất (
m). - Nếu
negCntlẻ VÀ n chẵn → phải để lại một số âm nhỏ nhất → kết quả = sum - 2*m. - Ngược lại → kết quả = sum.
Ví dụ minh họa (C++)
#include <bits/stdc++.h>
using namespace std;
int getMaxSum(int* arr, int n) {
int negCnt = 0;
int sum = 0;
int m = INT_MAX;
for (int i = 0; i < 2*n - 1; ++i) {
if (arr[i] < 0) ++negCnt;
sum += abs(arr[i]);
m = min(m, abs(arr[i]));
}
if (negCnt % 2 == 1 && n % 2 == 0) sum -= 2 * m;
return sum;
}
int main() {
int arr[] = {-2, 100, -3};
int n = 2;
cout << "Tong lon nhat = " << getMaxSum(arr, n) << endl;
return 0;
}
Kết quả
Tong lon nhat = 105