Фон
Перестройка Неравенство является неравенство, которое основано на перестановкой чисел. Если у меня есть два списка чисел одинаковой длины, x 0 , x 1 , x 2 ... x n-1 и y 0 , y 1 , y 2 ... y n-1 одинаковой длины, где I разрешено переставлять числа в списке, способ максимизировать сумму x 0 y 0 + x 1 y 1 + x 2 y 2 + ... + x n-1 y n-1 состоит в сортировке 2 списков в неубывающий порядок.
Прочитайте статью Wikipedia здесь.
задача
Вы бы написали программу, которая принимает входные данные из STDIN, или функцию, которая принимает 2 массива (или связанных контейнеров) чисел (одинаковой длины).
Предполагая, что вы пишете функцию, которая принимает 2 массива (a и b), вы найдете количество способов, которыми вы можете переставить числа во втором массиве (b), чтобы максимизировать:
a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+...+a[n-1]*b[n-1]
В этом случае, если массив b равен [1 0 , 2 1 , 2 2 , 3 3 , 3 4 ] (индексы для наглядности),
[1 0 , 2 1 , 2 2 , 3 3 , 3 4 ],
[1 0 , 2 1 , 2 2 , 3 4 , 3 3 ], (поменяйте местами 3)
[1 0 , 2 2 , 2 1 , 3 3 , 3 4 ] (поменяйте местами 2)
[1 0 , 2 2 , 2 1 , 3 4 , 3 3 ] (поменяйте местами 3 и поменяйте местами 2)
считаются разными мероприятиями. Сам исходный массив также считается возможной перестановкой, если он также максимизирует сумму.
Для ввода STDIN вы можете предположить, что длина массивов указана перед массивами (просьба указать, что вы используете их), или что массивы указаны в разных строках (также укажите, пожалуйста).
Вот 4 возможных входа (для удобства):
5 1 1 2 2 2 1 2 2 3 3 (length before arrays)
1 1 2 2 2 1 2 2 3 3 (the 2 arrays, concatenated)
1 1 2 2 2
1 2 2 3 3 (the 2 arrays on different lines)
5
1 1 2 2 2
1 2 2 3 3 (length before arrays and the 2 arrays on different lines)
Для вывода вы можете вернуть ответ (если вы пишете функцию) или распечатать ответ в STDOUT. Вы можете выбрать вывод мод 10 9 +7 (от 0 до 10 9 +6), если это более удобно.
Тестовые случаи (и объяснение):
[1 1 2 2 2] [1 2 2 3 3] => 24
Первые 2 записи должны быть 1 и 2. Последние 3 записи - это 2, 3 и 3. Есть 2 способа расположить 2 между первыми 2 записями и последними 2 записями. Среди первых 2 записей есть 2 способа их переставить. Среди последних 2 записей есть 6 способов их перегруппировать.
[1 2 3 4 5] [6 7 8 9 10] => 1
Существует только 1 способ, который представляет собой расположение в массивах.
[1 1 ... 1 1] [1 1 ... 1 1] (10000 numbers) => 10000! or 531950728
Каждая возможная перестановка второго массива действительна.
Тест Денниса: Pastebin => 583159312 (мод 1000000007)
Подсчет очков:
Это код-гольф, поэтому выигрывает самый короткий ответ.
В случае ничьей, связи будут разорваны к моменту подачи, что благоприятствует более раннему представлению.
Принять к сведению:
Контейнеры могут быть несортированными.
Целые числа в контейнерах могут быть нулевыми или отрицательными.
Программа должна работать достаточно быстро (максимум час) для массивов небольшого размера (около 10000 в длину).
Вдохновленный этим вопросом о математике стек обмена.
источник
[. . .]
ответ плзОтветы:
CJam,
3026 байтовПопробуйте онлайн в интерпретаторе CJam .
Он завершает этот контрольный пример менее чем за секунду:
Запуск его в онлайн-переводчике должен занять не более 10 секунд.
Алгоритм
Результат не зависит от порядка A , поэтому мы можем предположить, что он отсортирован. Это означает, что B также должен быть отсортирован, чтобы получить максимальное произведение точек.
Теперь, если r 1 ,… r n - длина прогонов отсортированного A , есть kr k ! различные перестановки элементов A, которые все еще приводят к возрастанию.
Аналогично, если s 1 ,… s n - длина прогонов отсортированного B , то есть ks k ! различные перестановки элементов B, которые все еще приводят к возрастанию.
Тем не менее, это подсчитывает все спаривания несколько раз. Если мы возьмем пары соответствующих элементов отсортированных A и B и определим t 1 ,… t n как длину прогонов результирующего массива, kt k ! является вышеупомянутым множителем.
Таким образом, желаемый результат равен (∏r k !) × (∏s k !) ÷ (∏t k !) .
Код
источник
Pyth,
2928 байтПопробуйте онлайн в компиляторе Pyth .
Алгоритм
Результат не зависит от порядка A , поэтому мы можем предположить, что он отсортирован. Это означает, что B также должен быть отсортирован, чтобы получить максимальное произведение точек.
Теперь, если r 1 ,… r n - длина прогонов отсортированного A , есть kr k ! различные перестановки элементов A, которые все еще приводят к возрастанию.
Аналогично, если s 1 ,… s n - длина прогонов отсортированного B , то есть ks k ! различные перестановки элементов B, которые все еще приводят к возрастанию.
Тем не менее, это подсчитывает все спаривания несколько раз. Если мы возьмем пары соответствующих элементов отсортированного A и отсортированного B и определим t 1 ,… t n как длину прогонов результирующего массива, kt k ! является вышеупомянутым множителем.
Таким образом, желаемый результат равен (∏r k !) × (∏s k !) ÷ (∏t k !) .
Код
верификация
Я псевдослучайно сгенерировал 100 тестовых случаев длины 6, которые я решил с помощью приведенного выше кода и этого подхода грубой силы:
Это были результаты:
Чтобы убедиться, что моя заявка удовлетворяет требованиям скорости, я запустил ее в этом тестовом примере .
источник
Matlab, 230 байт
выполнение
Тест Денниса:
Выходы:
источник
C ++, 503 байта
(просто для удовольствия, не для игры в гольф)
Безголовая версия:
источник