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.