如何查找具有一组整数的函数的'max absolute sum'

How to find the 'max absolute sum' of a function with a set of integers

本文关键字:函数 max sum absolute 整数 何查找 查找 具有一      更新时间:2023-10-16

我正在尝试在C 中解决此问题,努力寻找一个o(1)的解决方案。

给定一个四个整数的输入阵列,将它们变成一个顺序,使得F(s) = abs(s[0]-s[1]) + abs(s[1]-s[2])+ abs(s[2]-s[3])是最大的(绝对)。

如果整数都是唯一的,则最大为24个可能的混音。

例如。

A=5, B=3, C=-1, D=5

改组为

A=5, B=-1, C=5, D=3

将导致

F(s) = 14;

此算法应为O(1)。

请注意负整数和正整数的混合。

F(s) = abs(s[0]-s[1]) + abs(s[1]-s[2])+ abs(s[2]-s[3])

如果您从0, a, a+b, a+b+c进行所有排列(使用abc阳性),您会看到最大值已达到:

  • a, a+b+c, 0, a+b
  • 和对称a+b, 0, a+b+c, a

(在2*a + 3*b + 2*c中产生)。

不可读的解决方案(将"排序"到位):

int rearrange(int (&a)[4])
{
    if (a[3] < a[2]) {
        std::swap(a[3], a[2]);
    } // a[2] <= a[3]
    if (a[1] < a[0]) {
        std::swap(a[1], a[0]);
    } // a[2] <= a[3] && a[0] <= a[1]
    if (a[0] < a[2]) {
        std::swap(a[0], a[2]);
    } // a[2] <= a[3] && a[2] <= a[0] <= a[1] -> a[2] is the min
    if (a[1] < a[3]) {
        std::swap(a[1], a[3]);
    } // a[2] <= a[3] <= a[1] && a[2] <= a[0] <= a[1] -> a[1] is the max
    if (a[3] < a[0]) {
        std::swap(a[3], a[0]);
    } // a[2] <= a[0] <= a[3] <= a[1]
    // as we know order, we might get rid of abs:
    // (a[1] - a[0]) + (a[1] - a[2]) + (a[3] - a[2]);
    return -a[0] + 2 * a[1] - 2 * a[2] + a[3];
}

demo