Il compito è semplice. Get me alcuni 1000, 500e 100le 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, 500e 100le 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 1500nota, 5100note e1000note di riposo - Altrimenti se
A%500 == 0, l'ATM sputa 5100note,1000note di riposo - In caso contrario
A%1000 < 500, l'ATM sputa lefloor(A/1000)1000note e le100note di riposo - In caso contrario
A%1000 > 500, l'ATM sputa lefloor(A/1000)1000note, 1500e le100note di riposo
- Se
- L'importo prelevato è maggiore di uguale a
5000- Se
A%1000 == 0, l'ATM sputa 2500note e le1000note di riposo - In caso contrario
A%500 == 0, l'ATM sputa 1500nota e le1000note di riposo - In caso contrario
A%1000 < 500, l'ATM sputa lefloor(A/1000)1000note e le100note di riposo - In caso contrario
A%1000 > 500, l'ATM sputa lefloor(A/1000)1000note, 1500e le100note 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, 500e 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 2finire in un tempo ragionevole?