Если вы сделаете все перестановки из 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];
}
Демо