No Canadá, o centavo não é mais distribuído. Os pagamentos em dinheiro são arredondados para os 5 centavos mais próximos.
O dinheiro pode ser economizado dividindo-se as compras. Por exemplo, dois itens de US $ 1,02 custam US $ 2,04, que arredondam para US $ 2,05, mas ao comprar os itens em compras separadas, cada preço é arredondado para US $ 1,00, totalizando US $ 2,00. No entanto, ao comprar dois itens por US $ 1,03 cada, é melhor comprá-los em uma única compra.
Outra maneira de economizar dinheiro é usar um cartão de crédito quando o arredondamento é desfavorável, porque os pagamentos não são arredondados. Se quisermos dois itens de US $ 1,04, o preço total será de US $ 2,10, independentemente de como dividimos as compras. Portanto, devemos pagar por esses itens com cartão de crédito.
Escreva uma função ou programa que aceite uma lista de preços de itens como números inteiros em centavos e produz o menor preço total possível (em centavos) para os itens que podem ser alcançados através de uma sequência de compras, cada uma em dinheiro ou por crédito.
O menor código vence.
Casos de teste
[] : 0
[48] : 48
[92, 20] : 110
[47, 56, 45] : 145
[55, 6, 98, 69] : 225
[6, 39, 85, 84, 7] : 218
[95, 14, 28, 49, 41, 39] : 263
[92, 6, 28, 30, 39, 93, 53] : 335
[83, 33, 62, 12, 34, 29, 18, 12] : 273
[23, 46, 54, 69, 64, 73, 58, 92, 26] : 495
[19, 56, 84, 23, 20, 53, 96, 92, 91, 58] : 583
[3, 3, 19, 56, 3, 84, 3, 23, 20, 53, 96, 92, 91, 58, 3, 3] : 598
[2, 3, 4, 4, 4, 4, 4] : 19
s.reduce(:+)
(normalmente você nem precisa de parênteses, mas no seu caso ...) e inlinem
por 2 caracteres adicionais.a,b,c,d=(1..4).map{|i|s.count{|x|x%5==i}}
.0,
dareduce
chamada, o código quebra para a entrada vazia. Eu mencionei isso na resposta. Inlining m parece não ajudar. Obrigado pela última sugestão - isso foi estúpido da minha parte.(c-m=c>d ?d:c)
que lhe dá dois caracteres.-
tem maior prioridade do que=
. Será que a atribuição tem uma alta prioridade no lado esquerdo (como em para garantir que o operando esquerdo seja um valor l)?GolfScript (54 caracteres)
Este é um programa que recebe a entrada do stdin como valores separados por espaço. Um caractere pode ser salvo forçando o formato de entrada a ser como matrizes GolfScript.
Casos de teste online
O truque mais interessante é
.2$>$
para ummin
operador não destrutivo .Minha análise da matemática é essencialmente a mesma de Jan e Ray: considerando os valores mod 5, a única economia é em transações no valor de 1 ou 2. A opção do cartão de crédito significa que nunca arredondamos. Portanto, um item que custa 5n + 2 centavos não pode se beneficiar do pacote; nem um item vale 5n + 1 centavos (porque combinar duas economias de 1 centavo em uma economia de 2 centavos não traz nenhum benefício). 0 é a identidade aditiva, portanto, os únicos casos interessantes envolvem valores de 3 e 4.
3+3 = 1
e3+4 = 4+4+4 = 2
; se tivermos misturado 3s e 4s, otimizaremos preferindo3+4
sobre3+3
(estritamente melhor) ou4+4+4
(equivalente).fonte
~):m
), infelizmente, sem redução na contagem de caracteres.C ++: caractere 126
Bem-vindo a dar orientações para colocar esse programa mais curto. Aqui está o programa de teste, compile com o compilador tdm-gcc 4.7.1 e execute normalmente.
fonte
R 143
Testes (onde
P
existe um alias para o código acima)fonte
Mathematica
112 126 167157Edit : Casos de {3, 3} e {4,4,4} agora são tratados graças a Peter Taylor e paper_box.
Nota: As não compras (caso de teste nº 1) são inseridas como
f[{0}]
.Como funciona
Mod[n, 5]
é processado: 1 e 2 se tornam 0. Zeros permanecem inalterados.Teste
a12
ajusta para {3,3}a13
ajusta para {4,4,4}fonte
Python 3 (115 caracteres)
Python 2 (106 caracteres)
fonte
[3,4,9]
deve fornecer14
, porque você pode combinar os itens de 3 e 4 centavos para obter uma compra de 7 centavos que você paga em dinheiro com 5 centavos de dólar e o item de 9 centavos restantes que você paga com crédito, pois, caso contrário, eles seriam arredondados.1, 2, 3, 4, 5, 6, 7, 8, 9, 10
, isso dá0.0, 0.0, 2.5, 3.33, 5.0, 5.0, 5.0, 7.5, 8.33, 10.0
, o que equivale a46.66
. No entanto, a resposta correta é45
, portanto, a soma dos números impressos não é a resposta correta e, portanto, esta solução está incorreta.APL, 58 caracteres
O programa é essencialmente uma tradução direta da solução Ruby de Jan Dvorak .
⍬
é o vetor vazio.fonte
Julia 83C
Explicação:
Em uma compra, você pode economizar 2 centavos no máximo.
Portanto, se você tem uma combinação que pode economizar 2 centavos, basta comprar dessa maneira e será otimista. Por exemplo, se você possuix
itens com preço 3 (mod 5) ey
itens com preço 4 (mod 5), pode criar ummin(x, y)
número de (3, 4) pares, o que economiza2 min(x, y)
centavos. Então você usa os 3 restantes, se houver, para economizarmax(0, x-min(x,y)) / 2
centavos. Isso também pode ser calculado por(max(x,y)-y)/2
Editar
Esta solução está errada.
fonte
4 4 4 3 3
, então4 4 4
é uma combinação que pode salvar 2 centavos, mas comprá-lo dessa maneira não é o ideal. (Na verdade, você não parecem estar a tomar4 4 4
em consideração em tudo Não este código falhar o último caso de teste.?)