Что ж, когда я покупаю подарки для двух своих жен, я хочу, чтобы они чувствовали себя одинаково важными для меня, но ходить по магазинам с фиксированным бюджетом сложно. Вместо этого я покупаю кучу вещей и делю их на две группы с максимально возможной ценностью. Тогда я покупаю кучу конфет, чтобы починить все остальное.
Но я не хочу делать всю тяжелую работу, когда мой компьютер может это сделать. И ты тоже. Так что решите эту проблему так, чтобы в следующий раз, когда вам нужно было разделить подарки между вашими женами, вы знали, что это будет легко.
вход
1 массив (N * 2) элементов, где N * 2 указано в 1-й строке.
Элементы массива в следующей строке.
Выход
2 массива из N элементов, каждый из которых таков:
Разница (сумма элементов массива 1) и (сумма элементов массива 2) максимально приближена к 0.
пример
вход
4
1 2 3 4
Выход
1 4
2 3
diff=0
Отказ от ответственности : у меня нет двух жен. Но когда мне плохо, я представляю себе двух жен. И вдруг я благодарен и счастлив, что у меня есть только один. : D
источник
1 1 1 1 1 5
правильный ответ будет1 1 1
|1 1 5
, пока1 1 1 1 1
|5
будет иметь больше смысла.Ответы:
Джава
Попытка решить эту проблему в два этапа:
Ввод как
уже решена после фазы 1, например,
и ввод, как
понадобятся обе фазы, чтобы
(после первой фазы) становится результатом
Хотя я могу гарантировать, что эта попытка всегда даст решение, я не могу доказать, что оптимальное решение найдено во всех случаях. Однако с ограничением списков одинакового размера кажется вполне реальным, что здесь не осталось угловых случаев. Докажи, что я неправ ;-)
Программа на ideone.com
источник
Брахилог 2
Попробуйте онлайн!
Это конкурс популярности, но это не обязательно означает, что языки игры в гольф плохо подходят. (Действительно, я должен был ответить в Jelly, потому что ответы Jelly имеют тенденцию получать непропорциональное количество голосов по какой-то причине, независимо от того, кто их представляет или как они играют в гольф, но Brachylog более читабелен.)
Мы начнем с того, что берем список всех перестановок input (
pᶠ
) и разбиваем каждый (ᵐ
) на две равные части (ḍ
мы могли бы дать ему индекс, если по какой-то причине у вас было более двух жен). Затем мы упорядочиваем расстановку перестановок ({…}ᵒ
), беря сумму (+
) каждой (ᵐ
) половины, беря абсолютную разницу (т. Е.o-
«Упорядоченную разницу»), и используя эти различия для определения порядка сортировки. Лучший результат - первый, поэтому мы возьмем голову в списке,h
чтобы получить результат.источник
Mathematica
Формы ввода
Входная строка должна быть принята через STDIN.
assets
относится к суммам, которые будут распределены между женами (или близнецами).length
это количество активов.Для настоящих целей предположим, что активы состоят из целых чисел от 1 до 20.
обработка
Распределение несправедливо? Итак, выбери другое.
@ Конструктор отмечает, что жена 2 может оспаривать тот факт, что жена 1 получила все лучшие активы. Таким образом, следующее производит все «справедливые» (разница = самая низкая разница) акции для жены 1; жена 2 получает оставшиеся активы; ноль относится к разнице в активах для жен. Существует 5448 способов распределения активов с весом от 1 до 20. Отображается только несколько строк.
Формат
Предварительное представление можно найти среди правок. Это гораздо более неэффективно, полагаясь на это
Permutations
.источник
J
По этой ссылке есть шпаргалка со всеми примитивами J , на случай, если вы захотите следовать дома. Помните: J обычно читается справа налево, так что
3*2+1
это 7, а не 9. Каждый глагол (J для функции) является либо монадическим, то есть перед подобнымf y
, либо двоичным, то есть между подобнымx f y
.Примечания и объяснения:
u/
означает «сворачиваниеu
», поэтому выполняйте двоичную операцию над каждым элементом в списке. Так, например:+/
означает Fold Plus или Sum ;<.
является Lesser Of , поэтому<./
означает Fold Lesser Of или Minimum .u"1
означает «выполнятьu
на одномерных ячейках», то есть над каждым рядом. Обычно глаголы в J либо атомарные, либо применяются ко всему аргументу. Это относится к обоим аргументам, если глагол используется двоично (с двумя аргументами). Учтите следующее:#:
это глагол, который расширяет число в его двоичное представление. Когда вы используете его в списке с более чем одним элементом, он также правильно выровняет все числа, так что#:i.2^n
вы получите каждую двоичную строку длиныn
./.
, когда используется двоично, называется ключом . Он использует элементы списка с левой стороны в качестве ключей, а элементы с правой стороны - в качестве значений. Он группирует каждый набор значений, которые разделяют ключ, а затем выполняет с ними некоторую операцию.В случае
]/.
, операция - это просто глагол тождественности, поэтому ничего особенного там не происходит, но факт,/.
который разделит список для нас, является важным битом. Вот почему мы создаем двоичные списки: так, чтобы для каждого list ("1
) мы могли делить подарки для жен всеми возможными способами.1!:1]1
и1!:2&2
являются операциями чтения и записи соответственно.1!:n
Часть является глаголом , а другой номер является дескриптором файла.1
это консоль,2
это консоль, и3 4 5
это stdin, stdout и stderr. Мы также используем".
при чтении, чтобы преобразовать входные строки в числа.источник
Clojure
Тестовое задание
источник
[1 4 5 6 7 8]
вашей программы рассчитано,[8 5 4]
[7 6 1]
Diff 3
где явно существуют решения с разницей в 1.MATLAB
Вот мое решение:
Например, настоящий список в моем исходном коде приводит к:
который оба 16.
Если я играю в гольф мой код, который менее интересен, я получаю очень неоптимизированные 132 символа. Бить это;)
источник
PHP
Предупреждение: очень грязный код.
Он пробует каждую возможную перестановку входного массива.
Идеальный образец для
4/1 2 3 4
: http://ideone.com/gIi174источник
Python:
или немного одурманенный
Или даже дальше, потому что половина линии - это просто макияж. (при условии, что я могу просто сбросить необработанный внутренний массив, так как это не указано в операторе). Вы можете оставить
print
(например) в интерактивной оболочке и добавить[::-1]
(в самом конце, после[0]
), если вы действительно хотите Дифф последний.(результаты в
(0, ((1, 2, 7, 8), (3, 4, 5, 6)))
)Это, однако, просто брутфорс всех возможных комбинаций, и его не следует считать дистанционно эффективным. Однако, если список равной длины не имеет значения, это также будет работать (для больших массивов):
Например, с помощью этого кода он работает практически без разницы: максимальное значение 500k на 10 ^ 10, так сказать, немного. Это также намного быстрее: там, где другой код, вероятно, не завершится менее чем через год (и это очень оптимистично), это выполняется примерно за полсекунды, даже если ваш пробег может варьироваться.
источник
Грамотный хаскелл
Я использовал монаду списка, чтобы разделить ее.
Тогда мы делаем рейтинг.
И тогда функция, которая минимизирует разницу.
И то, что объединяет их всех.
Далее парсер.
И форматер вывода.
А теперь программа
Пример:
источник