Gabriel "Susu" Fernandes
Em um treino do MaratonIME qualquer, você encontra, no seu bolso direito, uma sequência não-decrescente de n números, com valores entre 1 e 10⁹.
Sena, um amante da geometria, não perde tempo e resolve criar um problema relacionando os números encontrados com triângulos. Ele te fará uma série de m perguntas do tipo:
Qual o triângulo de maior perímetro que posso formar cujos lados sejam valores da sequência entre as posições l e r?
Tamanho da sequência: n = 6,
Número de perguntas: m = 3
Sequência encontrada:
2 3 5 5 6 11
Perguntas do Sena:
l = 1, r = 6
l = 1, r = 4
l = 4, r = 6
Sequência encontrada:
2 3 5 5 6 11
Pergunta do Sena:
l = 1, r = 6
Sequência encontrada:
2 3 5 5 6 11
Pergunta do Sena:
l = 1, r = 6
Sequência encontrada:
2 3 5 5 6 11
Pergunta do Sena:
l = 1, r = 4
Sequência encontrada:
2 3 5 5 6 11
Pergunta do Sena:
l = 1, r = 4
Sequência encontrada:
2 3 5 5 6 11
Pergunta do Sena:
l = 4, r = 6
Impossível, já que 5 + 6 ≤ 11
Maior perímetro que consigo formar é 0, já que não consigo formar triângulo algum
Testar todas triplas possíveis de valores entre l e r.
Se consigo formar um triângulo, então verifico se este possui o maior perímetro analisado até agora.
Condição de existência:
Se a ≤ b ≤ c, deve valer que
a + b > c
Muito lenta! Podemos fazer melhor
Parâmetro n | Parâmetro m | Tempo de execução |
---|---|---|
100 | 100 | 1s |
1000 | 100 | 1000s |
10000 | 1000 | 30 milhões de anos |
Sempre vale a pena usar três valores consecutivos para formar um triângulo
Ao invés de testar todas as triplas, testar apenas as triplas consecutivas
Bem melhor!
Porém conseguimos melhorar ainda mais...
Parâmetro n | Parâmetro m | Tempo de execução |
---|---|---|
100 | 100 | 0,0001s |
1000 | 100 | 0,01s |
10000 | 1000 | 1s |
100000 | 100000 | 100s |
No pior dos casos, os números serão a sequência de fibonacci.
1, 1, 2, 3, 5, 8, 13, ...
No pior dos casos, os números serão a sequência de fibonacci.
1, 1, 2, 3, 5, 8, 13, ...
Mas como essa sequência cresce muito rápido, no seu 45º número ela já estoura o limite de 10⁹ para cada valor da sequência
Para cada pergunta do Sena, apenas testamos as últimas 45 triplas contínuas.
Parâmetro n* | Parâmetro m | Tempo de execução |
---|---|---|
1000 | 10000 | 0,001s |
100000 | 10000 | 0,001s |
100000 | 1000000 | 0,1s |
Obs: Esta solução nem depende mais do parâmetro n para o cálculo do seu tempo de execução
Venham pra Maratona