C++ 中任意排列的最大絕對差之和
在這個問題中,我們給定一個數組。我們的任務是建立一個程式,在 C++ 中找到任意排列的最大絕對差之和。
問題描述
我們將找到給定陣列元素的所有排列。然後找到陣列中相鄰元素的絕對差之和。最後,我們將返回所有和中的最大值。
讓我們舉個例子來理解這個問題,
輸入
arr[] = {9, 1, 6, 3}
輸出
17
解釋
All permutations of the array with sum of absolute difference of adjacent elements. {9, 1, 6, 3}, sum= |9-1| + |1-6| + |6-3| + |3-9| = 8+5+3+6 = 16 {9, 1, 3, 6}, sum= |9-1| + |1-3| + |3-6| + |6- 9| = 8+2+3+3 = 16 {9, 6, 1, 3}, sum= |9-6| + |6-1| + |1-3| + |3 - 9| = 3+5+2+6 = 16 {9, 6, 3, 1}, sum= |9-6| + |6-3| + |3-1| + |1 - 9| = 3+3+2+8 = 16 {9, 3, 1, 6}, sum= |9-3| + |3-1| + |1-6| + |6- 9| = 6+2+5+3 = 16 {9, 3, 6, 1}, sum= |9-3| + |3-6| + |6-1| + |1- 9| = 6+3+5+8 = 22 {1, 9, 6, 3}, sum= |1-9| + |9-6| + |6-3| + |3-1| = 8+3+3+2 = 16 {1, 9, 3, 6}, sum= |1-9| + |9-3| + |3-6| + |6 - 1| = 8+6+3+5 = 22 {1, 6, 9, 3}, sum= |1-6| + |6-9| + |9-3| + |3 - 1| = 5+3+6+2 = 16 {1, 6, 3, 9}, sum= |1-6| + |6-3| + |3-9| + |9-1| = 5+3+6+8 = 22 {1, 3, 9, 6}, sum= |1-3| + |3-9| + |9-6| + |6-1| = 2+6+3+5 = 16 {1, 3, 6, 9}, sum= |1-3| + |3-6| + |6-9| + |9 - 1| = 2+3+3+8 = 16 ..
並且所有以 6 和 3 為起始數字的排列。
解決方案方法
可以透過找到最大化解決方案的最佳方法來找到問題的簡單解決方案。為了最大化解決方案,我們需要找到陣列的所有最大絕對差。這可以透過使用 |最小值 - 最大值| 的絕對差來找到。
演算法
步驟 1 - 對陣列進行排序。
步驟 2 - 現在,maxsum 透過新增排序陣列中最小數字和最大數字之間的絕對差來計算。
步驟 3 - 最後,返回 maxSum。
示例
程式說明我們解決方案的工作原理,
#include <bits/stdc++.h> using namespace std; int calcMaxSumAbsDiff(int arr[], int N){ int maxSumArray[N]; int j = 0, maxSum = 0; sort(arr, arr + N); for (int i = 0; i < (N/2); ++i){ maxSumArray[j] = arr[i]; maxSumArray[j+1] = arr[N - i - 1]; j += 2; } if (N % 2 != 0) maxSumArray[j] = arr[N/2]; for (int i = 0; i < N - 1; i++){ maxSum += abs(maxSumArray[i] - maxSumArray[i + 1]); } maxSum += abs(maxSumArray[N - 1] - maxSumArray[0]); return maxSum; } int main(){ int arr[] = {9, 1, 6, 3}; int N = sizeof(arr) / sizeof(arr[0]); cout<<"The maximum sum of absolute difference of any permutation is "<<calcMaxSumAbsDiff(arr, N); }
輸出
The maximum sum of absolute difference of any permutation is 22
廣告