A breve descrição a seguir do conhecido "Google Eggs Puzzle" vem principalmente do site Google Eggs :
Quebra-cabeça de ovos do Google: dados n andares e m ovos, qual é a abordagem para encontrar o andar mais alto a partir do qual os ovos podem ser jogados com segurança, minimizando os arremessos (não os ovos quebrados).
O chamado "andar mais alto" no problema acima merece uma definição mais formal:
"mais alto:" deve haver um piso de f (em qualquer edifício suficientemente alto) de tal forma que um ovo caiu do f th quebras de chão, mas caiu do ( f-1 ) º andar não vai. Então, f-1 aqui é o andar mais alto.
Na verdade, a descrição de "mais alto" é um trecho do livro "The Algorithm Design Manual (Second Edition)", de Steven S. Skiena. Sendo um exercício no Capítulo 8 "Programação dinâmica", há muitos recursos na Web dedicados a resolver o quebra-cabeça por meio da programação dinâmica, como Google Eggs e The Two Egg Problem .
No entanto, há uma pergunta do livro acima:
É a pergunta que motiva o meu problema:
fonte
Respostas:
Com m ovos e medidas k, o maior número de andares que pode ser verificado é exatamente (talvez dependendo da definição exata). A prova é trivial por indução. Esta expressão não tem forma fechada inversa, mas fornece boas assintóticas.
fonte
No meu comentário acima, eu disse que talvez seja um limite apertado. Não tenho certeza sobre o limite inferior, mas como você quer apenas uma explicação para o que significa, posso explicar a intuição usando o limite superior.Θ(mink≤mkn1k) k
Como você adivinhou, é o número de ovos realmente usados. Isso explica a do lado de fora. Agora que decidimos usar eggs, eis uma estratégia que funciona: pense no número como sendo escrito na base . Portanto , a representação de terá "dígitos" (a palavra "dígito" é geralmente reservada para a base 10, mas usarei aqui), e cada dígito possui um valor de 0 a . Com nossos ovos, estamos tentando extrair os dígitos de um por um. Primeiro, começamos com o dígito mais significativo. Isso pode ser determinado jogando um ovo do chão numeradok min k n n1/k n k n1/k−1 k n 100..00 , e assim por diante. Após no máximo lances, aprendemos qual é o bit mais significativo e, no pior dos casos, quebramos apenas 1 ovo. Agora fazemos isso para todos os outros dígitos. Como existem dígitos, precisaremos de lances.200..00 n1/k−1 k O(kn1/k)
Como verificação de sanidade, observe que, quando , essa estratégia se resume a retirar ovos de cada andar, um a um, começando no andar 1. Quando , estamos apenas trabalhando na base 2. Portanto, isso gera o algoritmo de busca binária.k=1 k=logn
fonte