обзор
Учитывая список фейерверков a-z
и времени 3-78
, расставьте их с предохранителями, чтобы они загорелись в нужное время.
Строка ввода дается в виде разделенных пробелами букв и цифр:
a 3 b 6 c 6 d 8 e 9 f 9
Этот пример показывает, что фейерверк a
нужно зажигать вовремя 3
, b
и c
одновременно, в 6
, d
в 8
, e
и f
оба в 9
. Каждая строка соответствует одной карте.
Выходные данные представляют собой карту плавких предохранителей / фейерверков для каждой строки с использованием символов |-
для обозначения плавких предохранителей и букв для обозначения фейерверков.
А -
предохранитель подключается к предохранителей и фейерверк , непосредственно слева / справа от нее, тогда как |
предохранитель соединяется с теми выше / ниже. Например, предохранители ||
которые не подключены, и -|
являются .
Например, два возможных ответа на вышесказанное:
---a ---------f
| ||| ||
|-c ||| de
--|--d a||
| b | |c
f e b
Все карты предохранителей должны начинаться с одного -
в верхнем левом углу. Это та точка, где вы зажигаете предохранитель. Каждый символ взрывателя занимает одну секунду, чтобы сжечь. Как видите, на a
обеих диаграммах это достигается за три секунды, b
за шесть и т. Д.
Теперь обе приведенные выше карты действительны для данного ввода, но одна из них явно более эффективна. Левый использует только 13 единиц предохранителя, а правый - 20.
Предохранители не перегорают через фейерверк! Таким образом, для ввода a 3 b 5
, это недействительно:
---a--b
Вызов
Ваша цель - минимизировать количество предохранителей, используемых во всех тестовых случаях. Подсчет очков очень прост, общее количество используемых предохранителей.
Если вы не можете создать карту для тестового случая, независимо от того, является ли это невозможным или нет, оценка для этого случая является суммой всех времен (41 для примера выше).
В случае ничьей оценка изменяется, так что выигрывают самые компактные карты. Оценка тай-брейка - это площадь ограничительной рамки каждой карты. То есть длина самой длинной строки умножается на количество строк. Для «невозможных» карт это квадрат наибольшего числа (81 для примера выше).
В случае, когда представления связывают оба этих метода оценки, связывание переходит к более ранней записи / редактированию.
Ваша программа должна быть детерминированной, для целей проверки.
Тестовые случаи
Есть 250 случаев испытаний, расположенных здесь . Каждый имеет от 4 до 26 фейерверков. Минимальное время предохранителя для фейерверка - 3. Фейерверк в каждом случае «отсортирован» по времени и букве, что означает, b
что никогда не загорается раньше a
.
При публикации, пожалуйста, включите вашу полную программу, ваш общий балл и итоговую карту для (как минимум) первого контрольного примера, указанного в файле:
a 6 b 8 c 11 d 11 e 11 f 11 g 12 h 15 i 18 j 18 k 21 l 23 m 26 n 28 o 28 p 30 q 32 r 33 s 33 t 34
источник
rand.nextInt(5)%4
40%0
, и 20% для каждого1,2,3
.-+-
вместо того,---
чтобы автоматически не подключать фейерверк выше / ниже, все еще должен быть|
выше / ниже, чтобы подключить его к фейерверку.-+-
на месте-|-
все в порядке, как есть.Ответы:
C ++
Общая длина: 9059, Общая площадь: 27469, Сбои: 13.
Примечание. Оценка включает штрафы за ошибки.
Пример вывода:
Полный вывод: http://pastebin.com/raw.php?i=spBUidBV
Разве вы не любите грубые решения? Это немного больше, чем простой алгоритм возврата: наш неутомимый работник перемещается по карте, по мере необходимости размещая предохранители и фейерверки, одновременно проверяя все возможные движения в любой точке. Ну, почти --- мы действительно ограничиваем набор движений и рано покидаем неоптимальные состояния, чтобы это не занимало невыносимо много времени (и, в частности, чтобы оно заканчивалось). Особое внимание уделяется тому, чтобы не создавать никаких циклов или непреднамеренных пути, а не возвращаться тем же путем, которым мы пришли, поэтому гарантируется, что мы не посетим одно и то же состояние дважды. Тем не менее, поиск оптимального решения может занять некоторое время, поэтому мы в конечном итоге отказываемся от оптимизации решения, если оно занимает слишком много времени.
Этот алгоритм все еще имеет некоторый запас. С одной стороны, лучшие решения можно найти, увеличив
FRUSTRATION
параметры. Там нет конкуренции банкоматов, но эти цифры могут быть проверены, если и когда ...Компиляция с:
g++ fireworks.cpp -ofireworks -std=c++11 -pthread -O3
.Запуск с:
./fireworks
.Считывает ввод из STDIN и записывает вывод в STDOUT (возможно, не по порядку).
питон
Общая длина: 17387, Общая площадь: 62285, Сбои: 44.
Пример вывода:
Полный вывод: http://pastebin.com/raw.php?i=mgiqXCRK
Для справки, здесь гораздо более простой подход. Он пытается соединить фейерверк с одной главной линией предохранителей, создавая форму «лестницы». Если фейерверк не может подключиться к основной линии напрямую (что происходит, когда два или более фейерверка загораются одновременно), он прослеживает основную линию в поисках точки, где он может разветвляться перпендикулярно вниз или вправо (и происходит сбой, если такой точки не существует.)
Неудивительно, что он работает хуже, чем переборщик, но не с огромным отрывом. Честно говоря, я ожидал, что разница будет несколько больше.
Запуск с:
python fireworks.py
.источник