История
«2016? Хорошо ...», проворчал продавец игрушек Гильберт. Он открыл глаза, вытер салфетку, стекающую с его уха, и съел утренний клич-крем. Образцы праздников. Он должен пойти на работу сейчас и закончить бухгалтерский учет за год.
Рождество - очень урожайный период года, особенно для его продаж. Гильберт точно знает, как это работает: человек приходит в магазин и покупает первый подарок, который ему предлагают. Они платят за это и убегают в другой магазин. На практике то, что на самом деле является даром, на самом деле не имеет значения. Цена также не имеет значения, если она не слишком высока. Все зависит от времени, оставшегося до Рождества - чем короче время, тем больше угрызения совести у покупателей, тем больше цена, которую они готовы заплатить.
Все, что нужно Гилберту, это посмотреть на его часы - и он сразу знает, сколько могут потратить его клиенты. Он может легко воспользоваться этим фактом: он просто находит самый дорогой подарок, который он может продать данному клиенту, и предлагает его им. Только теперь он понял, что забыл применить эту хитрую стратегию в прошлом году. Это изменится хотя!
Тем не менее, Гильберт хотел бы знать, насколько процветал бы его бизнес, если бы он действительно использовал свою грандиозную схему. Ему удалось составить список людей, которые пришли в его магазин, однако он не уверен, сколько денег он мог бы заработать на них.
Ваша задача (TL; DR)
Входные данные состоят из возрастающего списка цен доступных подарков и списка бюджетов клиентов. Список бюджетов находится в том же порядке, в котором клиенты прибыли в магазин, при условии, что каждый клиент готов заплатить, по крайней мере, столько же, сколько и предыдущий, то есть он также возрастает.
Для каждого покупателя найдите самый дорогой подарок, за который он готов заплатить, и выведите его цену. Если в рамках бюджета нет доступных подарков, выведите a 0
.
Вы получаете -40%
бонус персонажа, если асимптотическая сложность времени вашего алгоритма O(n+m)
(а не тривиальная O(n*m)
) Где n, m
длины входных списков.
Это код-гольф , выигрывают короткие байты. Стандартные лазейки запрещены.
пример
Входные данные:
1 2 2 2 5 7 10 20
1 1 2 3 6 6 15 21 21 22
Выход:
1 0 2 2 5 2 10 20 7 0
Это задание было взято с местного конкурса программистов и переведено мной на английский язык. Вот оригинальное задание: https://www.ksp.sk/ulohy/zadania/1131/
Ответы:
Pyth,
1716 байт1 байт благодаря Pietu1998
демонстрация
Объяснение:
источник
VE=.-Q]
\ ne|fgNTQ0
. В основном то же самое, но с петлей.Haskell, 67 байт
Пример использования:
[1,2,2,2,5,7,10,20] # [1,1,2,3,6,6,15,21,21,22]
->[1,0,2,2,5,2,10,20,7,0]
.Разделите цены на две части:
(h,t)
гдеh
все цены <= бюджет следующего покупателя иt
все остальные. Возьмите последнюю ценуh
и продолжайте рекурсивно со всеми, кроме последнего изh
плюсаt
и оставшихся бюджетов.last(0:h)
оценивает,0
еслиh
пусто. Аналогично:init (h++[0|h==[]]) ++ t
добавляет фиктивный элемент0
вh
if, еслиh
он пуст, так что емуinit
есть что отбросить (init
ошибка в пустом списке).источник
Java, 154 * 0,6 = 92,4 байта
-13 байт, потому что лямбда может на самом деле использовать
int[]
, а неInteger[]
(спасибо BunjiquoBianco )Это должно занять O (n + m) времени и O (n + m) дополнительного пространства (при условии, что я понимаю большие обозначения O) .
С отступом: ( Попробуйте онлайн! )
Я показываю не лямбда-разложение здесь, потому что объявление типа чище, и это та же самая логика. Лямбда присутствует в идоне связи.
Объяснение:
Используемые переменные:
g
список цен на подарки,b
список бюджетов.gl
это длинаg
иbl
это длинаb
.a
это стек для доступных подарков,s
это выходной массив проданных подарков.gp
,bp
Иap
являются указателями дляg
,b
иa
соответственно.bp
также указатель дляs
.Алгоритм:
g[gp]
a
и увеличивайтеgp
a
в ,s[bp]
если она существует, то еще положить0
.источник
(g,b)->
кg->b->
?int
), мне нужно было использовать массив ссылочных типов. Но я могу использовать массив int просто отлично. Я обновлю, как только получу шанс.Haskell, 87 * 0,6 = 52,2 байта
Полностью отличается от моего другого ответа , потому что я иду на бонус.
Последняя строка (->
g[]
) не является частью определения, но вызывает накладные расходы. Пример использования:g [] [1,2,2,2,5,7,10,20] [1,1,2,3,6,6,15,21,21,22]
->[1,0,2,2,5,2,10,20,7,0]
.Работает в основном так же, как ответ @ CAD97 , т. Е. Использует (изначально пустой) вспомогательный стек для отслеживания покупаемых предметов. Подробно: проверьте по порядку:
Это работает во
m+n
времени, потому что a) операции со вспомогательным стеком используют постоянное время и b) в каждом из рекурсивных вызовов один из списков укорачивается на один элемент.источник
Желе , 15 байт
Попробуйте онлайн!
Как это устроено
источник
JavaScript, 85 * 0,6 = 51 байт
Еще один клон ответа @ CAD97.
источник