Ở đây chúng ta sẽ thấy một vấn đề thú vị. Chúng tôi đang lấy một mảng ‘a’ với N phần tử. Ta phải tìm một phần tử x sao cho | a [0] - x | + | a [1] - x | +… + | a [n-1] - x | được giảm thiểu. Sau đó, chúng ta phải tìm tổng nhỏ nhất.
Cho mảng là:{1, 3, 9, 6, 3} bây giờ x là 3. Vậy tổng là | 1 - 3 | + | 3 - 3 | + | 9 - 3 | + | 6 - 3 | + | 3 - 3 | =11.
Để giải quyết vấn đề này, chúng ta phải chọn trung vị của mảng là x. Nếu kích thước mảng là chẵn, thì hai giá trị trung vị sẽ ở đó. Cả hai đều sẽ là một lựa chọn tối ưu của x.
Thuật toán
minSum (arr, n)
begin sort array arr sum := 0 med := median of arr for each element e in arr, do sum := sum + |e - med| done return sum end
Ví dụ
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int minSum(int arr[], int n){
sort(arr, arr + n);
int sum = 0;
int med = arr[n/2];
for(int i = 0; i<n; i++){
sum += abs(arr[i] - med);
}
return sum;
}
int main() {
int arr[5] = {1, 3, 9, 6, 3};
int n = 5;
cout << "Sum : " << minSum(arr, n);
} Đầu ra
Sum : 11