Как найти баланс чисел в массиве? Всем привет.Кто знает какой алгоритм применить или может кто напишет решение по балансировке 2 массивов заполненными числовыми значениями так, что бы разница сумм между массивами была минимальная.Есть условие, что бы количество элементов в массивах различалось максимум на 1.const arr1 = [10, 300, 25, 75];
const arr2 = [50, 125, 500, 10];
balance(arr1, arr2);
// На выходе получаем
// [500, 25, 10, 10] => 545
// [300, 125, 75, 50] => 550

25 Дек 2019 в 19:52
320 +1
1
Ответы
1

Для решения данной задачи можно использовать жадный алгоритм:

Сначала отсортируем оба массива по убыванию.Создадим две переменные суммы sum1 и sum2 и проинициализируем их нулем.Пройдемся по элементам обоих массивов одновременно:
Если текущий элемент первого массива больше текущего элемента второго массива, добавим текущий элемент первого массива к sum1.Иначе добавим текущий элемент второго массива к sum2.После завершения цикла у нас будут две суммы: sum1 и sum2.Теперь сравним их: если sum1 больше sum2, то нужно уменьшить разницу между суммами, перемещая элементы из первого массива во второй. И наоборот.Для нахождения оптимального решения можно поочередно итерироваться по обоим массивам, перемещая элементы до тех пор, пока разница между суммами не станет минимальной и условие о разнице числа элементов в массивах на 1 не будет нарушено.

Ниже представлен код решения на JavaScript:

const balance = (arr1, arr2) => {
arr1.sort((a, b) => b - a);
arr2.sort((a, b) => b - a);
let sum1 = 0;
let sum2 = 0;
for (let i = 0; i < Math.max(arr1.length, arr2.length); i++) {
if (arr1[i] && arr2[i]) {
if (arr1[i] > arr2[i]) {
sum1 += arr1[i];
} else {
sum2 += arr2[i];
}
} else if (arr1[i]) {
sum1 += arr1[i];
} else if (arr2[i]) {
sum2 += arr2[i];
}
}
let diff = Math.abs(sum1 - sum2);
// Балансировка сумм
while (diff > 0) {
let i = 0;
while (arr1[i] && arr2[i]) {
let newDiff = diff - 2 * (arr1[i] - arr2[i]);
if (Math.abs(newDiff) < diff) {
diff = Math.abs(newDiff);
sum1 = sum1 - arr1[i] + arr2[i];
sum2 = sum2 - arr2[i] + arr1[i];
}
i++;
}
}
console.log('Сбалансированный массив 1:', arr1, '=>', sum1);
console.log('Сбалансированный массив 2:', arr2, '=>', sum2);
};
const arr1 = [10, 300, 25, 75];
const arr2 = [50, 125, 500, 10];
balance(arr1, arr2);

После выполнения этого кода вы увидите на выходе сбалансированные массивы с минимальной разницей в суммах.

18 Апр в 22:55
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 493 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир