3085 - O Grande Dia
Mais um dia, mais um problema de simulação Ad Hoc...
Last updated
Mais um dia, mais um problema de simulação Ad Hoc...
Last updated
A simulação deste problema, perguntando a cada passo se a pessoa chegou no destino ou se ela foi longe demais, é o suficiente para resolver este problema. Como cada cálculo que fazemos é feito em tempo constante, então tal solução é bastante eficiente, com complexidade O(n). Além disso, a simulação também é necessária por dois motivos: precisamos saber onde que é detectada a armadilha e imprimir apropriadamente; e também precisamos interromper as instruções se chegarmos na competição antes das instruções acabarem.
Ideia de implementação: usar variáveis inteiras para representar a distância de um ponto a outro para facilitar a comparação entre distâncias, que pode se provar problemática para variáveis do tipo double
. Neste caso, não precisamos tirar a raiz quadrada da distância euclidiana, mas com isso, precisamos elevar ao quadrado nosso limite k
.
O segredo todo está em como organizar seu código. No meu caso, escolhi representar em classes em todas as linguagens que permitiam tal representação, a fim de encapsular o comportamento de mover-se e verificar se já chegou ou passou dos limites dentro de um único objeto.
Aqui em baixo segue uma versão reduzida do código acima, usando muito menos memória, mas sacrificando bastante a legibilidade do código:
Os cálculos são feitos baseados em duas ideias:
A nova distância é calculada usando a seguinte equação para o quadrado de polinômios, pois sabemos que sempre vamos adicionar ou remover 1:
As coordenadas são calculadas novamente para poder reutilizar o x e o y nas fórmulas acima, usando a ideia de que ir para cima diminui em 1 o y, ir para baixo aumenta em 1 o y, ir para esquerda aumenta em 1 o x e para direita aumenta em 1 o x. É mais fácil entender a ideia se pensarmos que x e y armazenam as posições relativas em relação à posição atual do Italone, como se a posição do personagem nunca mudasse, o que muda é a posição do campeonato em relação à ele. É como se quando o Italone andasse, ele continuasse parado e o mundo que se mexe abaixo dos pés dele.