如何找到具有一组整数的函数的“最大绝对和”
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
进行所有排列(a
、b
、c
为正数),您会看到达到最大值:
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
【讨论】:
以上是关于如何找到具有一组整数的函数的“最大绝对和”的主要内容,如果未能解决你的问题,请参考以下文章