La historia
"2016? Muy bien", se quejó el vendedor de juguetes Hilbert. Abrió los ojos, se limpió el aderezo de ensalada que le goteaba de la oreja y se comió un cremoschnitte de arranque. Vacaciones ejemplares. Sin embargo, debe ir a trabajar ahora y terminar la contabilidad del año.
La Navidad es un período muy productivo del año, especialmente por sus ventas. Hilbert sabe exactamente cómo funciona: una persona entra en una tienda y compra el primer regalo que le ofrecen. Lo pagan y se van corriendo a otra tienda. En la práctica, lo que realmente es el regalo no hace la diferencia. El precio también es irrelevante, siempre que no sea demasiado alto. Todo depende del tiempo restante hasta Navidad: cuanto más corto es el tiempo, mayor es el remordimiento de los clientes, mayor es el precio que están dispuestos a pagar.
Todo lo que necesita Hilbert es mirar su reloj, y él sabe de inmediato cuánto pueden gastar sus clientes. Puede aprovechar fácilmente este hecho: encuentra el regalo más caro que puede vender a un cliente determinado y se lo ofrece. Solo ahora se ha dado cuenta de que olvidó emplear esta astuta estrategia el año pasado. ¡Eso va a cambiar sin embargo!
Sin embargo, a Hilbert le gustaría saber cuánto habría florecido su negocio si hubiera utilizado su gran esquema. Se las arregló para armar una lista de personas que vinieron a su tienda, sin embargo, no está seguro de cuánto dinero podría haber ganado con ellos.
Tu tarea (TL; DR)
La entrada consiste en una lista ascendente de precios de regalos disponibles y una lista de presupuestos de clientes. La lista de presupuestos está en el mismo orden en que los clientes llegaron a la tienda, con la condición de que cada cliente esté dispuesto a pagar al menos tanto como el anterior, lo que significa que también está ascendiendo.
Para cada cliente, encuentre el regalo más caro por el que está dispuesto a pagar y envíe su precio. Si no hay regalos disponibles dentro del presupuesto, salida a 0
.
Obtiene una -40%
bonificación de caracteres, si la complejidad de tiempo asintótica de su algoritmo es O(n+m)
(en lugar de la trivial O(n*m)
) ¿Dónde n, m
están las longitudes de las listas de entrada?
Este es el código de golf , gana los bytes más cortos. Las lagunas estándar están prohibidas.
Ejemplo
Entrada:
1 2 2 2 5 7 10 20
1 1 2 3 6 6 15 21 21 22
Salida:
1 0 2 2 5 2 10 20 7 0
Esta tarea fue tomada de una competencia de programación local y traducida al inglés por mí. Aquí está la tarea original: https://www.ksp.sk/ulohy/zadania/1131/
Respuestas:
Pyth,
1716 bytes1 byte gracias a Pietu1998
Demostración
Explicación:
fuente
VE=.-Q]
\ ne|fgNTQ0
. Básicamente lo mismo pero con un bucle.Haskell, 67 bytes
Ejemplo de uso:
[1,2,2,2,5,7,10,20] # [1,1,2,3,6,6,15,21,21,22]
->[1,0,2,2,5,2,10,20,7,0]
.Divida los precios en dos partes:
(h,t)
dondeh
están todos los precios <= el presupuesto del próximo cliente yt
son todos los demás. Tome el último precio deh
y continúe recursivamente con todos menos los últimos presupuestos y elh
mást
.last(0:h)
evalúa0
sih
está vacío. Similar:init (h++[0|h==[]]) ++ t
agrega un elemento ficticio0
ah
sih
está vacío, por lo queinit
tiene algo que descartar (init
falla en la lista vacía).fuente
Java, 154 * 0.6 = 92.4 bytes
-13 bytes porque la lambda realmente puede usar
int[]
, noInteger[]
(gracias BunjiquoBianco )Esto debería tomar O (n + m) tiempo y O (n + m) espacio adicional (suponiendo que entiendo la notación O grande) .
Sangrado: (¡ Pruébelo en línea! )
Aquí muestro la expansión no lambda porque la declaración de tipo es más limpia y es exactamente la misma lógica. La lambda está presente en el enlace ideone.
Explicación:
Variables utilizadas:
g
es la lista de precios de regalos,b
es la lista de presupuestos.gl
es la longitud deg
ybl
es la longitud deb
.a
es una pila de regalos asequibles,s
es la gama de salida de regalos vendidos.gp
,bp
Yap
son punteros parag
,b
ya
respectivamente.bp
es también el puntero paras
.Algoritmo:
g[gp]
a
e incrementegp
a
ens[bp]
si existe, de lo contrario poner0
.fuente
(g,b)->
tog->b->
?int
), necesitaba usar una matriz de tipos de referencia. Pero puedo usar una matriz de int bien. Actualizaré una vez que tenga la oportunidad.Haskell, 87 * 0.6 = 52.2 bytes
Completamente diferente de mi otra respuesta , porque voy por la bonificación.
La última línea (->
g[]
) no es parte de la definición, sino que llama a la sobrecarga. Ejemplo de uso:g [] [1,2,2,2,5,7,10,20] [1,1,2,3,6,6,15,21,21,22]
->[1,0,2,2,5,2,10,20,7,0]
.Funciona básicamente de la misma manera que la respuesta de @ CAD97 , es decir, utiliza una pila auxiliar (inicialmente vacía) para realizar un seguimiento de los artículos que se pueden comprar. En detalle: verificar en orden:
Esto funciona a
m+n
tiempo, porque a) las operaciones en la pila auxiliar usan tiempo constante yb) en cada una de las llamadas recursivas, una de las listas se acorta en un elemento.fuente
Jalea , 15 bytes
Pruébalo en línea!
Cómo funciona
fuente
JavaScript, 85 * 0.6 = 51 bytes
Otro clon de la respuesta de @ CAD97.
fuente