Primeiro quebra-cabeça de mim, sugestões de melhorias recebidas com prazer!
O cenário é; Você trabalha como gerente de uma empresa de rafting. Todas as manhãs, você recebe uma lista de reservas e precisa classificá-las em jangadas. Escreva um programa ou função no idioma escolhido que faça isso por você.
Cada jangada comporta um máximo de n
clientes e cada reserva é para um grupo de 1 a n
pessoas (inclusive). As seguintes regras devem ser observadas;
Nenhum grupo pode ser dividido. Se eles reservaram juntos, todos devem estar na mesma balsa.
O número de balsas deve ser minimizado.
Sujeitos às duas regras anteriores, os grupos devem ser divididos o mais igualmente possível entre as jangadas.
Entradas.
O número n
(você pode assumir que este é um número inteiro positivo) e o tamanho de todas as reservas. Pode ser uma matriz, lista ou estrutura de dados semelhante se o seu idioma suportar essas coisas. Todos estes serão números inteiros positivos entre 1 e n
. A ordem das reservas não está definida, nem é importante.
Saída. Uma lista dos números de reserva, agrupados em cargas de jangada. O agrupamento deve ser indicado sem ambiguidade, como;
- uma lista ou matriz de matrizes.
- uma lista separada por vírgula para cada jangada. Nova linha entre cada jangada.
A decisão de como você implementa a terceira regra é sua, mas isso pode envolver encontrar a ocupação média da jangada e minimizar os desvios dela o máximo possível. Aqui estão alguns casos de teste.
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]
Aplicam-se regras padrão, o código mais curto vence. Diverta-se!
Editado; Uma maneira sugerida de definir o mais igualmente possível para a terceira regra.
Uma vez determinado o número de balsas r
(sujeito à segunda regra), a ocupação média a
pode ser calculada somando-se as reservas e dividindo por r
. Para cada jangada, o desvio da ocupação média pode ser encontrado usando d(x) = abs(n(x)-a)
, onde n(x)
é o número de pessoas em cada jangada e 1 <= x <= r
. Para algumas funções contínuas de valor único f(y)
, estritamente positivas e com segundas derivadas estritamente positivas e não negativas para todas as positivas y
, definimos uma quantidade não negativa F
, como a soma de todas as f(d(x)), 1 <= x <= r
. Qualquer escolha de alocação de jangada que satisfaça as duas primeiras regras e onde F
seja igual ao mínimo global também atenderá à terceira regra.
g(y) = y
(segunda derivada zero) ou g(y) = y²
(primeiro dervia o zero quando y = 0
).