Il compito è semplice. Get me alcuni 1000
, 500
e 100
le note.
Come ? potresti chiedere. Non preoccuparti, non è necessario rapinare una banca in quanto nelle vicinanze c'è un bancomat che accetta la tua carta di credito. Ma il tuo limite di credito è appena sufficiente per l'attività, quindi devi stare attento con i prelievi.
Sfida
Dato il numero di 1000
, 500
e 100
le note richieste, il calcolo dei prelievi specifici necessari per ottenere almeno quelle molte note. In ogni prelievo, l'ATM può sputare ciascuna nota in base alle seguenti regole:
- L'importo ritirato (
A
) è inferiore a5000
- Se
A%1000 == 0
, allora ATM sputa 1500
nota, 5100
note e1000
note di riposo - Altrimenti se
A%500 == 0
, l'ATM sputa 5100
note,1000
note di riposo - In caso contrario
A%1000 < 500
, l'ATM sputa lefloor(A/1000)
1000
note e le100
note di riposo - In caso contrario
A%1000 > 500
, l'ATM sputa lefloor(A/1000)
1000
note, 1500
e le100
note di riposo
- Se
- L'importo prelevato è maggiore di uguale a
5000
- Se
A%1000 == 0
, l'ATM sputa 2500
note e le1000
note di riposo - In caso contrario
A%500 == 0
, l'ATM sputa 1500
nota e le1000
note di riposo - In caso contrario
A%1000 < 500
, l'ATM sputa lefloor(A/1000)
1000
note e le100
note di riposo - In caso contrario
A%1000 > 500
, l'ATM sputa lefloor(A/1000)
1000
note, 1500
e le100
note di riposo
- Se
Per chiarimenti, ecco una tabella completa di note ritirate per tutti gli importi possibili fino a 7000
(è possibile prelevare di più, ma il modello non cambia successivamente). L'ordine è <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
Elenco fornito da Martin
La presa
Poiché il limite di credito nella tua carta di credito è appena sufficiente, devi assicurarti che l' importo totale prelevato attraverso i prelievi sia il minimo possibile per l'input / requisito dato delle note.
Ingresso
L'input può essere in qualsiasi formato favorevole per tre numeri corrispondenti al numero di note richieste di valore 1000
, 500
e 100
. Non necessariamente in questo ordine.
Produzione
L'output è l'importo da prelevare in ogni transazione separata da una nuova riga.
Esempi
Input (formato <1000> <500> <100>
):
3 4 1
Produzione:
600
600
600
3600
qualcuno di più:
7 2 5
5000
3500
1 2 3
600
1700
21 14 2
600
600
600
1600
5000
5000
5000
5000
5000
ipotesi
- Si può presumere che il bancomat abbia un numero infinito di note per ciascun importo.
- Puoi anche presumere di poter effettuare un numero qualsiasi di transazioni.
- Inoltre, la soluzione per alcuni valori di input potrebbe non essere univoca, quindi è possibile produrre 1 qualsiasi della soluzione che soddisfi la quantità minima possibile e le condizioni minime richieste.
Come al solito, è possibile scrivere un programma completo che legge l'input tramite STDIN / ARGV e stampa l'output su STDOUT o una funzione che accetta input tramite argomenti e restituisce un elenco di numeri interi corrispondenti agli importi o una stringa con importi separati da una nuova riga.
Questo è code-golf, quindi vince il codice più breve in byte.
21 14 2
finire in un tempo ragionevole?