En Canadá, el centavo ya no circula. Los pagos en efectivo se redondean a los 5 centavos más cercanos.
El dinero se puede ahorrar dividiendo las compras. Por ejemplo, dos artículos de $ 1.02 cuestan $ 2.04, que se redondean a $ 2.05, pero al comprar los artículos en compras separadas, cada precio se redondea a $ 1.00 por un total de $ 2.00. Sin embargo, al comprar dos artículos a $ 1.03 cada uno, es mejor comprarlos en una sola compra.
Otra forma de ahorrar dinero es usar una tarjeta de crédito cuando el redondeo es desfavorable, porque los pagos de crédito no son redondeados. Si queremos dos artículos de $ 1.04, el precio total se redondeará a $ 2.10 independientemente de cómo dividimos las compras. Por lo tanto, debemos pagar estos artículos con una tarjeta de crédito.
Escriba una función o programa que acepte una lista de precios de artículos como enteros en centavos y genere el precio total más bajo posible (en centavos) para aquellos artículos que se pueden lograr a través de una secuencia de compras, ya sea en efectivo o con crédito.
El código más corto gana.
Casos de prueba
[] : 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 incluso no necesita paréntesis, pero en su caso ...) y en líneam
para 2 caracteres adicionales.a,b,c,d=(1..4).map{|i|s.count{|x|x%5==i}}
.0,
de lareduce
llamada, el código se rompe para la entrada vacía. Mencioné eso en la respuesta. Inline m no parece ayudar. Gracias por la última sugerencia, fue una estupidez de mi parte.(c-m=c>d ?d:c)
que te da dos caracteres.-
tiene mayor prioridad que=
. ¿Es que la asignación tiene una alta prioridad en su lado izquierdo (como en, para garantizar que el operando izquierdo sea un valor)?GolfScript (54 caracteres)
Este es un programa que toma la entrada de stdin como valores separados por espacios. Un carácter podría guardarse forzando el formato de entrada para que sea como matrices de GolfScript.
Casos de prueba en línea
El truco más interesante es
.2$>$
para unmin
operador no destructivo .Mi análisis de las matemáticas es esencialmente el mismo que el de Jan y Ray: considerando los valores mod 5, el único ahorro es en transacciones con valor de 1 o 2. La opción de tarjeta de crédito significa que nunca redondeamos. Por lo tanto, un artículo que cuesta 5n + 2 centavos no puede beneficiarse de la agrupación; ni un artículo que valga 5n + 1 centavos (porque combinar dos ahorros de 1 centavo en un ahorro de 2 centavos no da ningún beneficio). 0 es la identidad aditiva, por lo que los únicos casos interesantes involucran valores de 3 y 4.
3+3 = 1
y3+4 = 4+4+4 = 2
; Si hemos mezclado 3s y 4s, entonces optimizamos al preferir3+4
sobre3+3
(estrictamente mejor) o4+4+4
(equivalente).fuente
~):m
) desafortunadamente sin reducción en el recuento de caracteres.C ++: 126 caracteres
Bienvenido a dar orientación para que este programa se acorte. Aquí está el programa de prueba, compile con el compilador tdm-gcc 4.7.1 y ejecútelo normalmente.
fuente
R 143
Pruebas (donde
P
hay un alias para el código anterior)fuente
Mathematica
112 126 167157Editar : los casos de {3, 3} y {4,4,4} ahora se manejan gracias a Peter Taylor y cartón_box.
Nota: No compras (caso de prueba # 1) se ingresan como
f[{0}]
.Cómo funciona
Mod[n, 5]
se procesa: 1 y 2 se convierten en 0. Los ceros permanecen sin cambios.Pruebas
a12
se ajusta para {3,3} sea13
ajusta para {4,4,4}fuente
Python 3 (115 caracteres)
Python 2 (106 caracteres)
fuente
[3,4,9]
debería dar14
, porque puede combinar los artículos de 3 y 4 centavos para obtener una compra de 7 centavos que paga en efectivo con 5 centavos, y el artículo restante de 9 centavos que paga con crédito porque de lo contrario se redondearía.1, 2, 3, 4, 5, 6, 7, 8, 9, 10
, esto da0.0, 0.0, 2.5, 3.33, 5.0, 5.0, 5.0, 7.5, 8.33, 10.0
, lo que suma46.66
. Sin embargo, la respuesta correcta es45
, por lo que la suma de los números que imprime no es la respuesta correcta y, por lo tanto, esta solución es incorrecta.APL, 58 caracteres
El programa es esencialmente una traducción directa de la solución Ruby de Jan Dvorak .
⍬
Es el vector vacío.fuente
Julia 83C
Explicación:
En una compra, puede ahorrar 2 centavos como máximo.
Entonces, si tiene una combinación que puede ahorrarle 2 centavos, simplemente cómprela de esa manera y será óptima. Por ejemplo, si tienex
artículos con precio 3 (mod 5) yy
artículos con precio 4 (mod 5), puede hacer unmin(x, y)
número de (3, 4) pares, lo que le ahorrará2 min(x, y)
centavos. Luego usas los 3 restantes, si los hay, para ahorrartemax(0, x-min(x,y)) / 2
centavos. Esto también se puede calcular por(max(x,y)-y)/2
Editar
Esta solución está mal.
fuente
4 4 4 3 3
entonces4 4 4
es una combinación que puede ahorrar 2 centavos, pero comprarlo de esa manera no es óptimo. (De hecho, no parece estar teniendo4 4 4
en cuenta en absoluto. ¿No falla este código en el último caso de prueba?)