如何查找具有一组整数的函数的'max absolute sum'
How to find the 'max absolute sum' of a function with a set of integers
我正在尝试在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
进行所有排列(使用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
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- std::max() 函数与定点实现的比较中的问题
- 没有函数模板的实例"max"与参数列表参数类型匹配(int、int)
- 为什么在这种情况下不能将 Max 用作函数?
- 从递归向后选择排序函数调用 max 和交换函数
- 为什么 c++ 编译器在对两种不同类型的数值变量使用"std::max()"函数时会出现错误
- 自动变量可存储函数指针到std :: max
- 如何查找具有一组整数的函数的'max absolute sum'
- 在调试中,如何知道对函数的重复调用中参数的统计数据(max-min,average,distribution..)
- 当我尝试编译程序时,我遇到了一堆错误,例如:'std::max':找不到匹配的重载函数
- int max(一个变量)和 int max(int ,int)之间没有冲突,这是 C++ 中的一个函数
- c++ PPL 并行工作 - 归约类 'combinable' 中的函数 max()
- 在Armadillo稀疏矩阵中使用max函数时出错
- 如何将大于 std::numeric_limits<fundamental_type>::max() 的值传递给函数?
- 为template类定义numeric_limits-max函数
- 如何在c++中创建一个max函数来搜索数列中的最大值?
- 为数组创建c++ max函数:处理数组大小为0的情况的正确方法是什么?