Solução escrita por Caique Paiva
Conhecimento prévio necessário:
Vamos primeiro resolver o seguinte problema primeiro:
Dado um vetor , encontre uma dupla
tal que
e
ou diga que não existe nenhuma.
Para resolver, primeiro ordene o vetor em ordem crescente. Então, coloque um ponteiro no final da lista (Chamado de ) e outro no começo (Chamado de
), e faça o seguinte algoritmo:
- Se
, então conseguimos o que queríamos.
- Se
, então, faça
, e dai a soma atual de
vai diminuir, pois
.
- Se
, então, faça
, e dai a soma atual de
vai aumentar, pois
.
Se em algum momento, então paramos o algoritmo. Esse algoritmo funciona pois, se existe uma dupla
, então, primeiro que o algoritmo passa por todos os índices do vetor, logo, alguma das duas coisas vai acontecer primeiro, ou
, ou
, então, suponha sem perda de generalidade que o que acontece primeiro é que
, e logo
, pois
aconteceu primeiro. Portanto, como
, temos que a soma atual é
, então, vamos sempre diminuir o
até ele chegar no
, logo, nós sempre chegamos na dupla desejada, se ela existir.
Esse algoritmo roda em .
Vamos resolver o problema original agora.
Primeiro, vamos ordenar o vetor por ordem crescente. Agora, veja que queremos achar uma tripla tal que , portanto, vamos variar
começando por
e indo até
, e para cada
, vamos procurar uma dupla
tal que
, com
. Sabemos como fazer isso em
, então, como fazemos isso para cada
entre
a
, conseguimos fazer isso em
.
Recomendamos que você tente implementar o problema antes de ver o código. Veja a implementação nesse link.