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 nclientes e cada reserva é para um grupo de 1 a npessoas (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 apode 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 Fseja 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).