Ofertas 3 por 2
En una tienda tienen la «oferta 3 por 2» de forma que cada cliente que elige 3 artículos obtiene el más barato de forma gratuita. Por ejemplo, si los precios de los artículos elegidos por un cliente son 10, 2, 4, 5 euros pagará 19 euros si agrupa los artículos en (10,2,4) y (5) o pagará 17 si lo agupa en (5,10,4) y (2).
Definir la función
1 |
minimoConOferta :: [Int] -> Int |
tal que (minimoConOferta xs) es lo mínimo que pagará el cliente si los precios de la compra son xs; es decir, lo que pagará agrupando los artículos de forma óptima para aplicar la oferta 3 por 2. Por ejemplo,
1 2 3 |
minimoConOferta [10,2,4,5] == 17 minimoConOferta [3,2,3,2] == 8 minimoConOferta [6,4,5,5,5,5] == 21 |
Soluciones
1 2 3 4 5 6 |
import Data.List (sort) minimoConOferta :: [Int] -> Int minimoConOferta xs = aux (reverse (sort xs)) 0 where aux (a:b:_:ds) n = aux ds (a+b+n) aux as n = n + sum as |