A tarefa é simples. Tirem-me alguns 1000
, 500
e 100
notas.
Como ? você pode perguntar. Não se preocupe, não há necessidade de roubar um banco, pois há um caixa eletrônico nas proximidades que aceita seu cartão de crédito. Mas seu limite de crédito é suficiente para a tarefa, portanto, você deve ter cuidado com as retiradas.
Desafio
Dado o número de 1000
, 500
e 100
notas necessário, calcular os levantamentos específicos necessários para obter, pelo menos aquelas muitas notas. Em cada retirada, o caixa eletrônico pode cuspir cada uma das notas com base nas seguintes regras:
- O valor retirado (
A
) é menor que5000
- Se
A%1000 == 0
, o ATM cospe 1500
nota, 5100
notas e1000
notas de repouso - Else if
A%500 == 0
, a ATM cospe 5100
notas, descansar1000
notas - Caso contrário
A%1000 < 500
, o ATM cospefloor(A/1000)
1000
notas e100
notas de repouso - Caso contrário
A%1000 > 500
, o ATM cospefloor(A/1000)
1000
notas, 1500
e100
notas de repouso
- Se
- O valor retirado é maior que igual a
5000
- Se
A%1000 == 0
, então, o ATM cospe 2500
notas e restantes1000
notas - Caso contrário
A%500 == 0
, o ATM cospe 1500
nota e outras1000
notas - Caso contrário
A%1000 < 500
, o ATM cospefloor(A/1000)
1000
notas e100
notas de repouso - Caso contrário
A%1000 > 500
, o ATM cospefloor(A/1000)
1000
notas, 1500
e100
notas de repouso
- Se
Para esclarecimento, segue uma tabela completa de notas retiradas para todos os valores possíveis até 7000
(você pode retirar mais, mas o padrão não muda posteriormente). A ordem é <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 fornecida por Martin
A pegada
Como o limite de crédito no seu cartão de crédito é apenas o suficiente, você precisa garantir que o valor total retirado entre as retiradas seja o mínimo possível para a entrada / requisito especificado de notas.
Entrada
A entrada pode estar em qualquer formato favorável para três números correspondentes ao número de notas necessárias para o valor 1000
, 500
e 100
. Não necessariamente nesta ordem.
Saída
Saída é a quantia a ser retirada em cada transação separada por uma nova linha.
Exemplos
Entrada (formato <1000> <500> <100>
):
3 4 1
Saída:
600
600
600
3600
mais alguns:
7 2 5
5000
3500
1 2 3
600
1700
21 14 2
600
600
600
1600
5000
5000
5000
5000
5000
Suposições
- Você pode assumir que o caixa eletrônico possui um número infinito de notas de cada quantia.
- Você também pode assumir que pode fazer qualquer número de transações.
- Além disso, a solução para alguns valores de entrada pode não ser única, portanto, você pode produzir qualquer 1 da solução que atenda à quantidade mínima possível e que anote as condições necessárias.
Como de costume, você pode escrever uma entrada completa de leitura de programa via STDIN / ARGV e imprimir a saída em STDOUT ou uma função que recebe entrada por meio de argumentos e retorna uma lista de números inteiros correspondentes aos valores ou uma string com valores separados por uma nova linha.
Este é o código-golfe, pelo que o código mais curto em bytes vence.
21 14 2
concluído em um tempo razoável?