Menu Close

El problema del reciclado

El problema del reciclado N P consiste en lo siguiente: un grupo de personas disponen de N botellas de refresco vacía y las llevan a reciclar obteniendo una botella llena por cada P vacías; se beben inmediatamente el contenido de las botellas obtenidas y sus botellas vacías, junto con las no recicladas anteriormente, las canjean por botellas llenas. El proceso continúa hasta que no tienen suficientes botellas para canjear. El objetivo del problema es calcular el número de botellas que se han bebido.

Por ejemplo, si disponen de 10 botellas y por cada 2 obtienen 1, se producen cuatro canjeos:

  • en el primer canjeo entregan las 10 y obtienen 5;
  • en el segundo, entregan 4, le quedan 1 y obtienen 2;
  • en el tercero, entregan 2, le queda 1 y obtienen 1;
  • en el cuarto, entregan 2 y obtienen 1.

Por tanto, se han bebido 9 y le quedan 1 que no pueden canjear.

Definir la función

   reciclado :: Int -> Int -> Int

tal que (reciclado n p) es el número de botellas que se beben en el reciclado comenzado con n botellas y canjeando p botellas vacías por una llena. Por ejemplo,

   reciclado  9 3  ==  4
   reciclado 10 2  ==  9

Referencia: Este ejercicio está basado en el problema Soda surpler de Kattis.

Soluciones

reciclado :: Int -> Int -> Int
reciclado n p = aux n 0
  where aux x k | x < p     = k
                | otherwise = aux (a+b) (k+a) 
          where (a,b) = divMod x p
Posted in Medio

8 Comments

  1. enrnarbej
    reciclado :: Int -> Int -> Int
    reciclado n p | n < p = 0
                  | otherwise = b + reciclado (b + n `mod` p) p
                  where b = n `div` p
  2. joscasgom1
    reciclado :: Int -> Int -> Int
    reciclado n x | n < x = 0
                  | mod n x == 0 = y + reciclado y x
                  | otherwise = y + reciclado (n+y*(1-x)) x
                  where y = div n x
  3. albcercid
    reciclado :: Int -> Int -> Int
    reciclado n p | t == 0 = 0
                  | otherwise = t + reciclado (t + rem n p) p
                     where t = div n p
  4. paumacpar
    reciclado :: Int -> Int -> Int
    reciclado n p = aux n 0
      where aux k l | k < p = l 
                    | otherwise = aux (t+r) (t+l)
                      where (t,r) = divMod k p
  5. javcancif
    reciclado :: Int -> Int -> Int
    reciclado n p | n < p = 0
                  | otherwise = n `div` p + reciclado (n `div` p + n `rem` p) p
  6. glovizcas
    reciclado :: Int -> Int -> Int
    reciclado n p | n < p = 0
                  | mod n p == 0 = (div n p) + reciclado (div n p) p
                  | otherwise = (div n p) + reciclado  (div (n + mod n p) p) p
  7. marmerzaf
    reciclado n p | n < p = 0
                  | otherwise = sum ( [n `div` p] ++ [reciclado (n `div` p + n `mod` p) p])
  8. antdursan
    reciclado :: Int -> Int -> Int
    reciclado n p | div n p == 0 = 0
                  | otherwise = k + (reciclado (m+k) p)
                where k = div n p
                      m = mod n p

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.