Найдите четыре фактора числа, чтобы их произведение было максимальным, а их сумма - исходным числом. - PullRequest
0 голосов
/ 30 марта 2020

Учитывая количество тестов T и целое число N, вам нужно найти четыре целых числа A, B, C, D, так что все они являются множителями N (A | N, B | N, C | N, D | N) и N = A + B + C + D. Цель состоит в том, чтобы максимизировать A * B * C * D. Если невозможно найти такие четыре фактора, просто верните -1. ​​

Формат ввода для задачи:
Первая строка содержит целое число T (1 <= T <= 40000), представляет количество тестовых случаев. <br>Каждая из следующих T строк содержит целое число N (1 <= N <= 40000, N ^ 4 не будет превышать 64-разрядное целое число). <br>

Этот вопрос находится на Hackerearth в категории рекурсии, но я не могу понять алгоритм в редакционной статье (редакционная ссылка: - https://www.hackerearth.com/practice/basic-programming/recursion/recursion-and-backtracking/practice-problems/algorithm/divide-number-a410603f/editorial/).

В редакционной статье это было решено с использованием дробных единиц, но я не могу понять алгоритм (я предоставил редакционную статью ниже, если вы не можете открыть вышеуказанную ссылку, я не могу понять точки, отмеченные ***). Решение по грубой силе приводит к TLE (Превышен лимит времени). Пожалуйста, предоставьте алгоритм или псевдокод с использованием DFS или обратного отслеживания.

Мой метод грубой силы: - вычислите факторы числа 'n' в O (sqrt (n)) и сохраните их в массиве, затем проследите массив для получения A, B, C, D, используя четыре цикла for. Но для тестовых случаев T (1 <= T <= 40000) он получает TLE. </p>

Редакционное (Если вы не можете открыть вышеуказанную ссылку): -

Рассмотрим уравнение N = A + B + C + D, если мы разделим уравнение на N, мы получим 1 = 1 / A '+ 1 / B' + 1 / C '+ 1 / D', здесь A ', B', C ', D' - все целые, потому что A, B, C, D - это коэффициенты N.

Таким образом, исходная задача равна делению 1 на четыре дробные единицы. .

Мы можем перечислить дробные единицы от больших к малым.

*** Если нам нужно разделить X на дробные единицы Y, а последняя дробная единица равна 1 / Z, мы можем перечислите дробные единицы между 1 / Z и X / Y (потому что мы перечисляем наибольшую оставшуюся дробь) и рекурсивно решаем.

*** После находим все решения для 1 = 1 / A '+ 1 / B '+ 1 / C' + 1 / D '(около 20 решений, если числа в порядке), мы можем перечислить их в каждом тестовом примере. Если A ', B', C ', D' являются факторами N, мы можем использовать это решение для обновления ответа.

Сложность времени: O (T), где T - число Контрольные примеры.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Временную сложность вашего кода можно улучшить, используя только 3 для l oop и применяя двоичный поиск, чтобы найти четвертое число, поскольку временная сложность двоичного поиска равна log (n). Временная сложность = O (n ^ 3 * (log (n))) и в соответствии с ограничениями вопроса он должен пройти все тестовые случаи.

0 голосов
/ 01 апреля 2020

*** Если нам нужно разделить X на Y единичных дробей, а последняя дробная единица равна 1 / Z, мы можем перечислить единичные дроби между 1 / Z и X / Y (потому что мы перечисляем наибольшую оставшуюся дробь) и рекурсивно решить.

Ответ: Мы пытаемся найти все комбинации из 1 = 1 / A + 1 / B + 1 / C + 1 / D. Первоначально, мы имеем X = 1 и Y = 4, и мы перечисляем A как самый большой фактор, который должен быть не меньше, чем X / Y = 1/4. Поскольку это первый элемент, последней дроби 1 / Z не существует. Предположим, мы выбрали A = 3, поэтому последняя дробь 1 / Z равна 1 / A = 1/3, а X = 1-1 / 3 = 2/3, а Y = 3. Теперь мы выберем 1 / B из [X / Y, 1 / Z] = [2/9, 1/3]. И сделайте то же самое для следующих шагов.

*** После найдите все решения для 1 = 1 / A '+ 1 / B' + 1 / C '+ 1 / D' (около 20 решения, если числа в порядке), мы можем перечислить их в каждом тестовом примере. Если A ', B', C ', D' являются факторами N, мы можем использовать это решение для обновления ответа.

Ответ: Поскольку 1 / A должно быть не менее 1/4 , так что A может быть только 2, 3, 4. Если A == 4, то A = B = C = D, есть только одно решение. Если A == 3, [X / Y, 1 / Z] = [2/9, 1/3], так что B может быть только 3 или 4, если B == 4, то следующий раунд C должен быть 4 где [X / Y, 1 / Z] = [5/24, 1/4]; если B = 3, то C может быть 4,5,6, потому что [X / Y, 1 / Z] = [1 / 6,1 / 3]. Если A == 2, [X / Y, 1 / Z] = [1/6, 1/2], B может быть 3,4,5,6. Вы можете сделать остальное вычисление, используя код, чувствуя, что мы могли бы отрезать много ветвей поиска. (Игнорируйте мой порядок перечисления, вы должны начать с A = 2.)

...