
Autor: Luís Paquete (Universidade de Coimbra)
Tipo de problema: Geometria
Número de ficheiros de teste: 10
Este é um problema giro com várias resoluções possíveis. Vou
exemplificar uma solução que corre em O(B^3), o
que basta para passar (B<=200). Era possível fazer
bem melhor, mas assim ilustro três princípios que todos os meus
alunos têm obrigação de saber:
O primeiro princípio aplica-se logo on facto de bastar fazer
algo O princípio de reduzir dimensões dá muito jeito. Neste caso,
se o problema fosse apenas em 2D, seria mais fácil de resolver
mentalmente? Um ponto onde podemos atravessar a parede seria
definido apenas por Y. Assim, seja Como descobrir O essencial aqui era de algum modo usar a "geometria" dos dados
para de algum modo melhorarmos e eficiência da nossa pesquisa. Neste
caso, o ponto chave foi "ordenar", algo que é recorrente em
problemas deste tipo.
Ligações interessantes
O(B^3). Para quê complicar se passa no tempo? Em
concurso devemos analisar as restrições de memória e tempo e fazer
aquilo que é mais fácil de fazer.
parede(Y) a
quantidade de parede que atravessamos ao longo da coordenada
Y. Resolver o problema seria descobrir o Y com menor valor desta
função. E vale a pena testar todos os Y? Não! Basta testar apenas
os Y de início e logo a seguir ao fim de cada caixa! Este
princípio pode ser aplicado em 3D. E os possíveis pontos candidatos
são pares (Y,Z) através do mesmo raciocínio.
parede(Y,Z)? Tomando apenas em
linha de conta a coordenada X, chamemos ao ponto incial de uma
parede INi e ao ponto final dessa
parede OUTi. Se tivermos todos estes pontos
ordenados (por X), basta-nos então percorrê-los por ordem e, caso o
seu Y e Z seja relevante para o cálculo em causa, saber "dentro
de quantas paredes estamos" e com isso calcular a "quantidade
de parede que atravessamos"! Podemos também usar a ordenação dos
pontos por Y e por Z para por exemplo eliminarmos pontos candidatos
iguais (evitando recalcular). E ainda podemos fazer muitos mais cortes.