fundo
Imagine por um momento que você tem um trabalho entediante. Todas as manhãs, você recebe uma coleção de tarefas nas quais deve trabalhar naquele dia. Cada tarefa tem uma certa duração e, uma vez iniciada, deve ser concluída de uma só vez. Seu chefe não tolerará ociosidade; portanto, se houver tarefas que você ainda possa concluir antes de voltar para casa, trabalhe em uma delas (você pode escolher qual delas). Por outro lado, se todas as tarefas restantes exigirem que você faça horas extras, você poderá voltar para casa mais cedo! Assim, seu objetivo é minimizar a duração do seu dia de trabalho com agendamento inteligente.
Curiosidade: essa é uma variante do problema de agendamento do burocrata preguiçoso e é difícil para o NP ( fonte ).
Entrada
Você tem duas entradas: o número de "unidades de tempo" em seu dia de trabalho (um número inteiro positivo L
) e a coleção de tarefas (uma matriz não vazia de números inteiros positivos T
, representando a duração da tarefa). Eles podem ser obtidos em qualquer ordem e em qualquer formato razoável. A matriz T
pode conter tarefas com duração maior que L
, mas é garantido que contenha pelo menos uma tarefa com duração no máximo L
.
Saída
Um agendamento válido é um subconjunto de tarefas S ⊆ T
que sum(S) ≤ L
, e todas as tarefas que não estão S
(contando multiplicidades) têm duração estritamente maior que L - sum(S)
. Sua saída deve ser a menor soma possível de uma programação válida. Em outras palavras, você deve gerar o número mínimo de unidades de tempo que deve trabalhar hoje.
Exemplo
Considere as entradas
L = 9
T = [3,4,4,4,2,5]
Uma maneira de agendar seu dia é [4,4]
: você termina duas tarefas em 8 unidades de tempo e resta 1 unidade. Como não há tarefas de 1 unidade disponíveis, você pode ir para casa. No entanto, a programação [2,5]
é ainda melhor: você trabalha por 7 unidades de tempo e todas as tarefas restantes levam 3 ou mais unidades de tempo. O agendamento [2,4]
não é válido, pois depois de trabalhar por 6 unidades de tempo, você ainda terá tempo suficiente para concluir a tarefa de 3 unidades. 7 unidades são ideais, portanto a saída correta é 7
.
Regras e pontuação
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas. Não há tempo limitado, portanto forçar brutalmente é perfeitamente aceitável.
Casos de teste
Estes são dados no formato L T -> output
.
1 [1,2] -> 1
6 [4,1] -> 5
7 [7,7,9] -> 7
9 [3,4,4,4,2,5] -> 7
20 [6,2,3,12,7,31] -> 17
42 [7,7,7,7,8,8,8] -> 36
42 [7,7,7,7,7,8,8,8] -> 35
42 [7,7,7,7,7,7,8,8,8] -> 36
16 [1,2,3,4,5,6,7,8,9,10] -> 13
37 [15,27,4,1,19,16,20,26,29,18] -> 23
22 [24,20,8,8,29,16,5,5,16,18,4,9] -> 18
80 [10,22,11,2,28,20,27,6,24,9,10,6,27,2,15,29,27] -> 71
59 [26,28,5,4,7,23,5,1,9,3,7,15,4,23,7,19,16,25,26] -> 52