如何找到具有一组整数的函数的“最大绝对和”

Posted

技术标签:

【中文标题】如何找到具有一组整数的函数的“最大绝对和”【英文标题】:How to find the 'max absolute sum' of a function with a set of integers 【发布时间】:2019-02-13 13:08:44 【问题描述】:

我正在尝试用 C++ 解决这个问题,努力寻找 O(1) 的解决方案。

给定一个由四个整数组成的输入数组,将它们打乱成一个顺序,使F(s) = abs(s[0]-s[1]) + abs(s[1]-s[2])+ abs(s[2]-s[3]) 最大(绝对值)。

如果每个整数都是唯一的,则最多有 24 种可能的 shuffle。

例如

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])

【问题讨论】:

O(1) 具有固定大小的输入没有什么意义...因为检查 24 种可能性是O(1)... 也许赋值的设置者只是意味着无论输入值如何(固定大小的输入为 4),代码都应该花费恒定的时间来运行?您需要回到他们那里澄清他们的意思,因为@Jarod42 是正确的,O(1) 对于固定大小的输入没有多大意义。您找到了哪些解决方案?是什么让你认为他们不是O(1)?显示minimal reproducible example。 用几个输入检查 24 种可能性。你看到一个模式吗?你有不同的策略,只有正数吗?混合符号时正/负值在哪里?最小/最大(绝对)值在哪里? w.l.o.g.你可以只考虑非负数,因为如果你给每个值加上一个常数,答案是不变的。 @kvantour: 1, 8, 2, 4 -> 15 而4, 1, 8, 2 -> 16. 【参考方案1】:

如果您从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

【讨论】:

以上是关于如何找到具有一组整数的函数的“最大绝对和”的主要内容,如果未能解决你的问题,请参考以下文章

函数的定义,语法,二维数组,几个练习题

写一函数对输入的一组整数由小到大排序,在main主函数调用该函数实现排序。(输入任意个整数即可输出

c语言 查找并输出满足给定条件的一组整数

excel如何随机生成不重复整数?

找到给定函数依赖集的最小覆盖

在 C 和 C++ 中,链接器如何找到具有已实现函数的正确文件?