Завдання проста. Дайте мені кілька 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
закінчитися в розумний час?