โจทย์
กำหนดอาร์เรย์ หา permutation ที่ให้ผลรวม |a[i] - a[i+1]| (รวม circular |last - first|) สูงสุด
ตัวอย่าง: arr = {9, 1, 6, 3} → Max = 22 (เช่น 9,1,6,3 เรียงใหม่เป็น 3,9,1,6: |3-9|+|9-1|+|1-6|+|6-3| = 6+8+5+3=22)
วิธีการแก้ปัญหา (Greedy)
- เรียงอาร์เรย์จากน้อยไปมาก
- จัดเรียงใหม่: สลับกันระหว่างค่าน้อยที่สุดและมากที่สุดที่เหลือ → ได้ array แบบ "zigzag": min, max, 2nd min, 2nd max, ...
- คำนวณผลรวมความต่างสัมบูรณ์ของ array ใหม่นี้ (รวม circular)
ตัวอย่างโค้ด C++
#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