Zadanie jest proste. Daj mi trochę 1000
, 500
i 100
notatki.
W jaki sposób ? możesz zapytać. Nie martw się, nie musisz okradać banku, ponieważ w pobliżu znajduje się bankomat, który akceptuje Twoją kartę kredytową. Ale twój limit kredytowy wystarczy do wykonania zadania, więc musisz uważać na wypłaty.
Wyzwanie
Biorąc pod uwagę liczbę 1000
, 500
a 100
wymagane notatki, obliczenia wypłat konkretne potrzebne, aby uzyskać przynajmniej te kilka nut. Przy każdej wypłacie bankomat może wypluć każdą notatkę na podstawie następujących zasad:
- Kwota wycofana (
A
) jest mniejsza niż5000
- Jeśli
A%1000 == 0
, po czym wypluwa 1 ATM500
uwaga, 5100
notatki i odpoczynku1000
notatki - W przeciwnym razie
A%500 == 0
bankomat wypluwa 5100
banknotów,1000
banknoty pozostałych - W przeciwnym razie
A%1000 < 500
bankomat wypluwafloor(A/1000)
1000
notatki i100
notatki odpoczynku - W przeciwnym razie
A%1000 > 500
bankomat wypluwafloor(A/1000)
1000
banknoty, 1500
i100
banknoty spoczynkowe
- Jeśli
- Kwota wypłacona jest większa niż równa
5000
- Jeśli
A%1000 == 0
, to bankomat wypluwa 2500
banknoty i1000
banknoty pozostałe - Else if,
A%500 == 0
, bankomat wypluwa 1500
notatkę i odpoczynku1000
notatki - W przeciwnym razie
A%1000 < 500
bankomat wypluwafloor(A/1000)
1000
notatki i100
notatki odpoczynku - W przeciwnym razie
A%1000 > 500
bankomat wypluwafloor(A/1000)
1000
banknoty, 1500
i100
banknoty spoczynkowe
- Jeśli
Dla wyjaśnienia, oto pełna tabela wycofanych notatek dla wszystkich możliwych kwot do 7000
(możesz wypłacić więcej, ale wzór nie zmienia się później). Kolejność jest następująca <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
Lista dostarczona przez Martina
The Catch
Ponieważ limit kredytowy na karcie kredytowej jest wystarczający, musisz upewnić się, że całkowita kwota wypłacona w ramach wypłat jest minimalnym możliwym dla danego wkładu / wymogu dotyczącego banknotów.
Wkład
Dane wejściowe mogą być w dowolnym korzystnym formacie dla trzech liczb odpowiadających liczbie wymaganych nut wartości 1000
, 500
oraz 100
. Niekoniecznie w tej kolejności.
Wydajność
Produkcja globalna to kwota do wycofania w każdej transakcji oddzielona nową linią.
Przykłady
Dane wejściowe (format <1000> <500> <100>
):
3 4 1
Wydajność:
600
600
600
3600
trochę więcej:
7 2 5
5000
3500
1 2 3
600
1700
21 14 2
600
600
600
1600
5000
5000
5000
5000
5000
Założenia
- Możesz założyć, że bankomat ma nieskończoną liczbę banknotów każdej kwoty.
- Możesz również założyć, że możesz dokonywać dowolnej liczby transakcji.
- Co więcej, rozwiązanie niektórych wartości wejściowych może nie być unikalne, więc możesz wypisać dowolne 1 rozwiązanie, które spełnia minimalną możliwą ilość i wymagane minimum notatek.
Jak zwykle, możesz napisać pełny program czytający dane wejściowe przez STDIN / ARGV i wypisujący dane wyjściowe do STDOUT lub funkcję przyjmującą dane wejściowe za pomocą argumentów i zwracającą albo listę liczb całkowitych odpowiadających kwotom, albo ciąg znaków z kwotami oddzielonymi nowym wierszem.
To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach.
21 14 2
zakończyć się w rozsądnym czasie?