Gabriel "Susu" Fernandes

O Problema

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?

O Sena

Exemplo

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

Exemplo

Sequência encontrada:

2 3 5 5 6 11

Pergunta do Sena:

l = 1, r = 6

Exemplo

Sequência encontrada:

2 3 5 5 6 11

Pergunta do Sena:

l = 1, r = 6

Exemplo

Sequência encontrada:

2 3 5 5 6 11

Pergunta do Sena:

l = 1, r = 4

Exemplo

Sequência encontrada:

2 3 5 5 6 11

Pergunta do Sena:

l = 1, r = 4

Exemplo

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

Solução

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

Solução

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

Observação

Sempre vale a pena usar três valores consecutivos para formar um triângulo

Solução 2

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

Observação 2

No pior dos casos, os números serão a sequência de fibonacci.

1, 1, 2, 3, 5, 8, 13, ...

Observação 2

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

 

Solução 3

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

Obrigado!

Venham pra Maratona  

SIGEX

By Gabriel Fernandes