Подходы к тому, как разделить список - PullRequest
0 голосов
/ 10 марта 2019

Допустим, у меня есть n элементов со значением x[i].Пусть сумма всех значений будет обозначена как X, и мы обеспечим, чтобы каждый элемент был x[i] <= X/2.Теперь, учитывая массив x[], как я могу разбить его на две группы (размером не менее 1), чтобы сумма каждой группы была меньше или равна 2X / 3?

Я былна эту проблему на некоторое время.Я обнаружил некоторые случаи, когда это на самом деле невозможно сделать, но в остальном я углубился только в жадный подход: поместите элемент x[i] в раздел с наименьшей совокупной суммой.Есть идеи как подойти к этой проблеме?

1 Ответ

0 голосов
/ 10 марта 2019

Вы уверены, что вы нашли контрпримеры?Моя математика может быть неправильной, но кажется, что невозможно составить такой список.Заметим, что для списка из трех элементов a <= b <= c мы можем разделить их следующим образом: [a, b], [c].Это потому, что для a + b, чтобы быть больше, чем 2/3 от суммы, у нас было бы (a + b) * 3 > 2 * (a + b + c) или a + b > 2 * c, что означает, что a и / или b должно быть больше, чем c.

Имея это в виду, мы группируем наши числа в три ячейки, каждая из которых такова, что ее сумма меньше N/2.Обратите внимание, что если бы у нас было четыре элемента a <= b <= c <= d, мы могли бы разделить их как [a, b], [c], [d].Повторяя логику, как и раньше, для a + b, чтобы быть больше, чем N/2, нам понадобится (a + b) * 2 > (a + b + c + d) или a + b > c + d, что означает, что a и / или b должно быть больше, чем c.

Мы можем бесконечно повторять эту логику отсюда.Принимая наш список за x, чтобы a + b был больше N/2, нам понадобится (a + b) * 2 > sum(x), что невозможно для списка с 2 или большим количеством элементов больше, чем a и b (что относится ко всем спискам длиной 4 и более).

Применяя эту рекурсивную логику, мы можем построить путь от n бинов до трех бинов, обработать их как числа a, b, c из первого абзаца и построить наш ответ таким образом.

Алгоритмически создайте группу узлов, содержащих каждый элемент в массиве (как список длины один) и сумму (на данный момент равную самому элементу).Вставьте их в кучу мин, с суммой в качестве ключа.Поместите мин два, объедините их (объедините списки элементов, добавьте суммы) и вставьте обратно в кучу мин.Промойте и повторяйте, пока у вас есть два узла в куче.Теперь они содержат ваше решение.

...