Задача проста. Дайте мне несколько 1000
, 500
и 100
заметки.
Как ? Вы можете спросить. Не беспокойтесь, не нужно грабить банк, так как поблизости есть банкомат, который принимает вашу кредитную карту. Но ваш кредитный лимит достаточен для выполнения этой задачи, поэтому вы должны быть осторожны с выводом средств.
Вызов
Учитывая количество 1000
, 500
и 100
требуется ноты, рассчитать конкретные изъятия , необходимые для получения по крайней мере , те много заметок. При каждом снятии средств банкомат может выплевывать каждую банкноту на основании следующих правил:
- Сумма снята (
A
) меньше чем5000
- Если
A%1000 == 0
, то банкомат выплевывает 1500
заметку, 5100
заметок и остальные1000
заметки - В противном случае
A%500 == 0
, банкомат плюет 5100
заметок, остальные1000
заметки - В противном случае
A%1000 < 500
, банкомат плюетfloor(A/1000)
1000
заметки и остальные100
заметки - В противном случае
A%1000 > 500
, банкомат плюетfloor(A/1000)
1000
заметки, 1500
и остальные100
заметки
- Если
- Сумма снята больше чем равна
5000
- Если
A%1000 == 0
, то банкомат выплевывает 2500
заметки и остальные1000
заметки - В противном случае
A%500 == 0
банкомат выплевывает 1500
заметку и остальные1000
заметки - В противном случае
A%1000 < 500
, банкомат плюетfloor(A/1000)
1000
заметки и остальные100
заметки - В противном случае
A%1000 > 500
, банкомат плюетfloor(A/1000)
1000
заметки, 1500
и остальные100
заметки
- Если
Для пояснения приведена полная таблица записей, снятых на все возможные суммы до 7000
(вы можете снять больше, но впоследствии шаблон не изменится). Заказ <1000> <500> <100>
:
100 => 0 0 1 2500 => 2 0 5 4800 => 4 1 3
200 => 0 0 2 2600 => 2 1 1 4900 => 4 1 4
300 => 0 0 3 2700 => 2 1 2 5000 => 4 2 0
400 => 0 0 4 2800 => 2 1 3 5100 => 5 0 1
500 => 0 0 5 2900 => 2 1 4 5200 => 5 0 2
600 => 0 1 1 3000 => 2 1 5 5300 => 5 0 3
700 => 0 1 2 3100 => 3 0 1 5400 => 5 0 4
800 => 0 1 3 3200 => 3 0 2 5500 => 5 1 0
900 => 0 1 4 3300 => 3 0 3 5600 => 5 1 1
1000 => 0 1 5 3400 => 3 0 4 5700 => 5 1 2
1100 => 1 0 1 3500 => 3 0 5 5800 => 5 1 3
1200 => 1 0 2 3600 => 3 1 1 5900 => 5 1 4
1300 => 1 0 3 3700 => 3 1 2 6000 => 5 2 0
1400 => 1 0 4 3800 => 3 1 3 6100 => 6 0 1
1500 => 1 0 5 3900 => 3 1 4 6200 => 6 0 2
1600 => 1 1 1 4000 => 3 1 5 6300 => 6 0 3
1700 => 1 1 2 4100 => 4 0 1 6400 => 6 0 4
1800 => 1 1 3 4200 => 4 0 2 6500 => 6 1 0
1900 => 1 1 4 4300 => 4 0 3 6600 => 6 1 1
2000 => 1 1 5 4400 => 4 0 4 6700 => 6 1 2
2100 => 2 0 1 4500 => 4 0 5 6800 => 6 1 3
2200 => 2 0 2 4600 => 4 1 1 6900 => 6 1 4
2300 => 2 0 3 4700 => 4 1 2 7000 => 6 2 0
2400 => 2 0 4
Список предоставлен Мартином
Поймать
Поскольку кредитный лимит по вашей кредитной карте достаточно, вам необходимо убедиться, что общая сумма, снятая за снятие средств, является минимально возможной для данного ввода / требования к примечаниям.
вход
Ввод может быть в любом удобном формате для трех чисел, соответствующих количеству нот, требуемых для значения 1000
, 500
и 100
. Необязательно в этом порядке.
Выход
Вывод - это сумма, которая будет снята в каждой транзакции, разделенная новой строкой.
Примеры
Ввод (формат <1000> <500> <100>
):
3 4 1
Выход:
600
600
600
3600
еще несколько:
7 2 5
5000
3500
1 2 3
600
1700
21 14 2
600
600
600
1600
5000
5000
5000
5000
5000
Предположения
- Вы можете предположить, что в банкомате есть бесконечное количество банкнот каждой суммы.
- Вы также можете предположить, что можете совершить любое количество транзакций.
- Кроме того, решение некоторых входных значений может быть не уникальным, поэтому вы можете вывести любое 1 решение, которое удовлетворяет минимально возможному количеству и минимальным требованиям к примечаниям.
Как обычно, вы можете записать полное чтение программы ввода через STDIN / ARGV и распечатать вывод в STDOUT или функцию, принимающую ввод через аргументы и возвращающую либо список целых чисел, соответствующих суммам, либо строку с суммами, разделенными новой строкой.
Это код-гольф, поэтому выигрывает самый короткий код в байтах.
источник
21 14 2
закончиться в разумные сроки?Ответы:
JavaScript,
184148http://jsfiddle.net/vuyv4r0p/2/
возвращает список целых чисел, соответствующих суммам снятия
источник
g(5,1,1)
. Одно лучшее решение:5600
.g(5,1,0)
, Решение:5500
.g(5,2,0)
, Решение:6000
.Perl 5:
223редактировать
Это решение было сделано с ошибочным предположением, что 7K является лимитом банкомата. Это на самом деле сделало задачу более интересной, так как требовало динамического программирования (шаблон перемещения был довольно регулярным, но жесткое программирование было бы, вероятно, дольше, чем вычисление в реальном времени, как я). При любом возможном количестве шаблон перемещения настолько регулярен, что его просто написать жестко. Я не знаю, является ли решение @hoffmale правильным, но оно будет среди этих строк. К сожалению, это будет еще одна задача, когда сначала кто-то приходит с решением, а затем его переносят на язык игры в гольф для победы.
Немного медленнее, чем оригинальное решение (но все же меньше секунды для параметров ниже 100).
Решение быстрее 259.
Использует STDIN:
источник
10 0 0
. Лучшее решение:10100
.