Primer acertijo mío, ¡sugerencias de mejora recibidas con gusto!
El escenario es; Trabajas como gerente de una empresa de rafting en aguas bravas. Todas las mañanas, se le da una lista de reservas, y debe clasificarlas en cargas de balsa. Escriba un programa o función en el idioma elegido que haga esto por usted.
Cada balsa tiene un máximo de n
clientes, y cada reserva es para un grupo de entre 1 y n
personas (inclusive). Deben observarse las siguientes reglas;
No se pueden dividir grupos. Si reservaron juntos, todos deben estar en la misma balsa.
Se debe minimizar el número de balsas.
Sujeto a las dos reglas anteriores, los grupos deben distribuirse lo más equitativamente posible entre las balsas.
Entradas.
El número n
(puede suponer que es un número entero positivo) y el tamaño de todas las reservas. Esto puede ser una matriz, una lista o una estructura de datos similar si su idioma admite tales cosas. Todos estos serán enteros positivos entre 1 y n
. El orden de las reservas no está definido, ni es importante.
Salida. Una lista de los números de reserva, agrupados en cargas de balsa. La agrupación debe indicarse sin ambigüedades, como;
- una lista o matriz de matrices.
- una lista separada por comas para cada balsa. Nueva línea entre cada balsa.
La forma en que implemente la tercera regla depende de usted, pero esto podría implicar encontrar la ocupación promedio de la balsa y minimizar las desviaciones de ella tanto como sea posible. Aquí hay algunos casos de prueba.
n Bookings Output
6 [2,5] [5],[2]
4 [1,1,1,1,1] [1,1,1],[1,1]
6 [2,3,2] [2,2],[3]
6 [2,3,2,3] [2,3],[2,3]
6 [2,3,2,3,2] [2,2,2],[3,3]
12 [10,8,6,4,2] [10],[8,2],[6,4]
6 [4,4,4] [4],[4],[4]
12 [12,7,6,6] [12],[7],[6,6]
Se aplican reglas estándar, gana el código más corto. ¡Que te diviertas!
Editado; Una forma sugerida de definir lo más equitativamente posible para la tercera regla.
Una vez que r
se ha determinado el número de balsas (sujeto a la segunda regla), la ocupación promedio a
se puede calcular sumando las reservas y dividiendo por r
. Para cada balsa, se puede encontrar la desviación de la ocupación promedio d(x) = abs(n(x)-a)
, donde n(x)
es el número de personas en cada balsa y 1 <= x <= r
. Para alguna función continua de un solo valor f(y)
, que es estrictamente positiva y tiene una primera derivada estrictamente positiva y una segunda derivada no negativa para todas las positivas y
, definimos una cantidad no negativa F
, como la suma de todas las f(d(x)), 1 <= x <= r
. Cualquier elección de asignación de balsa que satisfaga las dos primeras reglas, y donde F
sea igual al mínimo global, también satisfará la tercera regla.
g(y) = y
(segundo derivado cero) o g(y) = y²
(primer derivado cero cuando y = 0
).