Aula de Tiago Silva
Busca Binária na Resposta
Fala rapaziada do Kode Bro na aula de hoje, nós iremos falar sobre um algoritmo muito importante e utilizado na programação competitiva, que é a Busca Binária na Resposta.
Primeiramente antes da explicação do algoritmo, eu recomendo que, se vocês não conheçam o problema Pão a Metro da OBI, lenham ele no link a seguir: https://neps.academy/problem/605, já que ele será utilizado na explicação da Busca Binária na Resposta.
Basicamente o objetivo do problema é achar o maior número que a soma da divisão dele pelos tamanhos dos sanduíches seja igual a N e nós conseguimos achar esse número através da implementação do algoritmo da nossa aula.
Igualmente na Busca Binária, sempre iremos precisar definir o início e o fim do intervalo em que está a nossa resposta, no problema acima, a nossa resposta pode estar entre 1, já que esse é o valor mínimo de N, e entre o tamanho do maior sanduíche, já que N não pode ser 0. Definido o início e o fim do intervalo da resposta, nós implementamos um while, até que o início seja menor ou igual ao fim(o fato do início ser menor ou igual ao fim varia em relação ao problema, pode ser que o while precise ser implementado com início somente menor que o fim, ou até mesmo em que a diferença entre fim e início seja maior que 1) e assim definimos também o meio do intervalo, igualmente na Busca Binária.
Agora é só definir o que irá acontecer durante a nossa Busca Binária. Primeiramente devemos criar uma função que calcule a soma das divisões do "meio" pelos tamanhos dos sanduíches, já que com o resultado dessa função que iremos definir as condições da nossa busca.
Se a função retorna um número igual a N, então "meio" é uma resposta possível, porém como queremos a MAIOR resposta possível devemos procurar valores maiores que o "meio", então ini=meio+1.
Se a função retorna um valor maior que N, precisamos que a "soma" diminua e assim devemos procurar números maiores que o "meio", já que dessa forma é muito provável que a divisão dos sanduíches por "meio" irá diminuir (por exemplo, se dividimos 8 por 2, recebemos 4, porém se dividimos 8 por um número maior que 2, como 6 recebemos 1).
Porém, se a função "corta" retornar um número menor que N, significa que fim=meio-1, pois devemos procurar números menores que "meio", já que assim a "soma" irá aumentar. E por fim, imprimimos a variável fim como resposta, já que ela será a última a ser calculada na nossa Busca Binária.
Segue o código para melhor entendimento:
Basicamente em uma Busca Binária na Resposta você deve, definir primeiramente o início e o intervalo da sua resposta, definir a condição do while e definir as condições de mudança do "ini" e do "fim", e como essas duas variáveis irão mudar.
Uma dica para realizar problemas que necessitam da implementação desse algoritmo, é escrever o funcionamento da sua Busca Binária no papel, já que dessa forma, você irá ter uma visão melhor de como o seu algoritmo está funcionando em relação ao problema, além de se prevenir de alguns erros bobos.
Qualquer dúvida nos contate através da
Links Recomendados
https://www.topcoder.com/community/competitive-programming/tutorials/binary-search
https://www.geeksforgeeks.org/the-ubiquitous-binary-search-set-1/