Solução por Lúcio Figueiredo
Conhecimento prévio necessário:
Imagine que foi criada uma configuração ótima de torres com cubos e que o cubo será inserido no próximo passo. Note que se o topo de todas as torres já criadas tem valor menor ou igual a , teremos que criar uma nove torre com no topo. Caso contrário, podemos inserir no topo de alguma torre já criada (pois queremos minimizar a quantidade de torres). O que resta é decidir em qual torre inserir .
É possível perceber que é sempre ótimo inserir o cubo na torre cujo valor de topo é o menor valor possível tal que . Este fato é verdade pois ao inserir na torre de menor topo possível, não "desperdiçamos" torres com valor de topo maior, e portanto, aumentamos a chance de não se tornar necessário criar uma nove torre com um próximo cubo.
Assim, podemos utilizar um multiset que guarda os valores nos topos de cada torre (precisamos utilizar o multiset pois alguns topos podem possuir valores iguais). A operação de encontrar o menor topo maior que é simplesmente uma operação de upper_bound no set. Caso não exista valor maior que no set, simplesmente criamos uma nova torre inserindo no set. Complexidade: .
Confira o código abaixo para melhor entendimento: