Computer >> Máy Tính >  >> Lập trình >> C ++

Giảm thiểu tổng bình phương của tổng N / 2 được ghép nối với nhau được tạo bởi N số trong C ++

Tuyên bố vấn đề

Cho một mảng gồm n phần tử. Nhiệm vụ là tạo n / 2 cặp sao cho tổng bình phương của n / 2 cặp là nhỏ nhất.

Ví dụ

Nếu mảng đã cho là -

arr[] = {5, 10, 7, 4}
then minimum sum of squares is 340 if we create pairs as (4, 10) and ( 5, 7)

Thuật toán

1. Sort the array
2. Take two variables which point to start and end index of an array
3. Calulate sum as follows:
   sum = arr[start] + arr[end];
   sum = sum * sum;
4. Repeate this procedure till start < end and increment minSum as follows:
   While (start < end) {
      sum = arr[start] + arr[end];
      sum = sum * sum;
      minSum += sum;
      ++start;
      --end;
   }

Ví dụ

#include <iostream>
#include <algorithm>
#define SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
using namespace std;
int getMinSquareSum(int *arr, int n) {
   sort(arr, arr + n);
   int minSum = 0;
   int start = 0;
   int end = n - 1;
   while (start < end) {
      int sum = arr[start] + arr[end];
      sum *= sum;
      minSum += sum;
      ++start;
      --end;
   }
   return minSum;
}
int main() {
   int arr[] = {5, 10, 7, 4};
   int res = getMinSquareSum(arr, SIZE(arr));
   cout << "Minimum square sum: " << res << "\n";
   return 0;
}

Đầu ra

Khi bạn biên dịch và thực thi chương trình trên. Nó tạo ra kết quả sau -

Minimum square sum: 340