Solução Informática – Nível Iniciante – Semana 42

por

Solução escrita por Arthur Lobo

Conhecimento prévio necessário:

Primeiro, enumeramos todos os possíveis valores de $$x$$, que podem variar de $$0$$ até $$\lceil\sqrt{D} \rceil$$. Isso acontece porque se $$x > \lceil\sqrt{D} \rceil$$, então o melhor $$y$$ é $$0$$. Isso faz com que qualquer solução $$(x,0)$$ ser pior do que $$(\lceil\sqrt{D} \rceil,0)$$.

Com o $$x$$ fixado, basta encontrar qual o melhor valor de $$y$$, ou seja, minimizar $$|D – x^2 – y^2|$$. Fazendo $$C = D – x^2$$, reduzimos o problema para, dado um inteiro $$C$$ minimizar $$|C – y^2|$$.

Se $$C = D- x^2$$ for menor ou igual a $$0$$, então o $$y$$ ótimo é $$0$$.

Se $$C$$ for maior que $$0$$, então o valor ótimo de $$y$$ será $$\lfloor\sqrt{C} \rfloor$$ ou $$\lceil\sqrt{C} \rceil$$.

Com essa solução, podemos varias $$x$$ de $$0$$ até $$\lceil\sqrt{D} \rceil$$ e encontrar os dois valores possíveis de $$y$$ em $$O(1)$$ utilizando a função sqrt do C++. Sendo assim, essa solução funciona em $$O(\sqrt{D})$$.

Clique aqui para conferir o código