Olá meus amigos nerds. Hoje vamos ver como fusos horários podem ser problemáticos. Já que é isso que o problema 20860. Voo nos pede para fazer. Mais especificamente, dados os horários de partida e chegada de um voo de ida e de um vôo volta entre duas cidades; determinar o tempo real de vôo bem como a diferença de fusos entre as cidades.
Solução
Quando li o problema achei que ele seria fácil, mas não é bem assim, ele impõe algum desafio. O segredo do problema está em perceber que: se em um trecho a diferença de fusos horários aumenta o tempo de viagem, no outro ela diminui o tempo. Assim se tirarmos a média entre os tempos totais de ida e volta teremos o tempo real de viajem, já que o fuso se cancela.
tempo_real = (tempo_ida + tempo_volta) / 2
Para encontrarmos o fuso bastaria subtrair o tempo real do tempo de ida ou de volta, isto é:
fuso = tempo_ida - tempo_real
Mas isso não resolve completamente o problema, já que, como o próprio problema afirma, as datas não estão completas. Ou seja, não sabemos se a data de chegada é a mesma da de saída ou se refere ao próximo dia. Assim para uma mesma entrada teríamos várias respostas, para desambiguar essas respostas o problema nos garante que a viajem durou menos de 12 horas.
Mas como poderíamos usar esse dado? Se pensarmos bem os tempos de viajem considerando que o avião chegou no mesmo dia e no dia seguinte diferem de no máximo 12 horas. Assim se tomarmos o módulo teremos o tempo pedido. Assim:
tempo_real = (tempo_ida + tempo_volta) / 2 mod 12
Lembrando que o fuso tem que ficar no intervalo -12 < fuso < 12 teríamos:
fuso = tempo_ida - tempo_real mod 24
if fuso > 12
fuso -= 24
tempo_real = (tempo_ida + tempo_volta) / 2
Para encontrarmos o fuso bastaria subtrair o tempo real do tempo de ida ou de volta, isto é:
fuso = tempo_ida - tempo_real
Mas isso não resolve completamente o problema, já que, como o próprio problema afirma, as datas não estão completas. Ou seja, não sabemos se a data de chegada é a mesma da de saída ou se refere ao próximo dia. Assim para uma mesma entrada teríamos várias respostas, para desambiguar essas respostas o problema nos garante que a viajem durou menos de 12 horas.
Mas como poderíamos usar esse dado? Se pensarmos bem os tempos de viajem considerando que o avião chegou no mesmo dia e no dia seguinte diferem de no máximo 12 horas. Assim se tomarmos o módulo teremos o tempo pedido. Assim:
tempo_real = (tempo_ida + tempo_volta) / 2 mod 12
Lembrando que o fuso tem que ficar no intervalo -12 < fuso < 12 teríamos:
fuso = tempo_ida - tempo_real mod 24
if fuso > 12
fuso -= 24
Nenhum comentário:
Postar um comentário