Alice, uma aluna, tem muito dever de casa nas próximas semanas. Cada item da lição de casa leva exatamente um dia. Cada item também tem um prazo e um impacto negativo em suas notas (assuma um número real, pontos de bônus por apenas assumir comparabilidade), se ela não cumprir o prazo.
Escreva uma função que, dada uma lista de (prazo, impacto de nota), determine um cronograma para o trabalho de casa em que dia, minimizando a soma do impacto negativo nas notas dela.
Todo o trabalho de casa precisa ser feito eventualmente, mas se ela não cumprir um prazo para um item, não importa a que horas o entregue.
Em uma formulação alternativa:
A ACME Corp quer fornecer água aos clientes. Todos eles vivem ao longo de uma rua morro acima. A ACME possui vários poços distribuídos ao longo da rua. Cada poço leva água suficiente para um cliente. Os clientes oferecem diferentes quantias de dinheiro a serem fornecidas. A água flui apenas ladeira abaixo. Maximize a receita escolhendo quais clientes fornecer.
Podemos classificar os prazos usando a classificação de bucket (ou apenas suponha que já classificamos por prazo).
Podemos resolver o problema facilmente com um algoritmo ganancioso, se classificarmos primeiro pelo impacto decrescente da nota. Essa solução não será melhor que O (n log n).
Inspirado na Mediana de Medianas e nos algoritmos lineares de abrangência mínima aleatória , suspeito que também possamos resolver meu problema simples de agendamento / fluxo no tempo linear (randomizado?).
Estou à procura de:
- um algoritmo de tempo linear (potencialmente randomizado)
- ou, alternativamente, um argumento de que o tempo linear não é possível
Como um trampolim:
- Já provei que apenas saber quais itens podem ser feitos antes do prazo final é suficiente para reconstruir o cronograma completo em tempo linear. (Esse insight está subjacente à segunda formulação, na qual estou apenas perguntando sobre certificado.)
- Um programa linear simples (integral!) Pode modelar esse problema.
- Usando a dualidade deste programa, pode-se verificar a solução proposta em candidato em tempo linear para otimizar, se também for dada a solução para o programa duplo. (Ambas as soluções podem ser representadas em um número linear de bits.)
Idealmente, quero resolver esse problema em um modelo que use apenas comparação entre impactos de notas e que não assuma números.
Eu tenho duas abordagens para esse problema: uma baseada em treaps usando prazo e impacto; a outra, QuickSelect, baseada na escolha de elementos dinâmicos aleatórios e particionando os itens por impacto. Ambos têm piores casos que forçam O (n log n) ou pior desempenho, mas não consegui construir um caso especial simples que prejudique o desempenho de ambos.