terça-feira, 4 de dezembro de 2012

UVa 10281 - Average Speed

Olá pessoal, nesse post irei colocar a solução e comentar o problema Average Speed, problema esse que está disponível no site do UVa Online Judge para quem quiser tentar resolver.

Caso você queira tentar resolver antes de ver a solução, então clique aqui para ir até a página do problema no UVa.

É um problema que exige um pouco de conhecimento sobre formatação de dados. Uma função que pode lhe ajudar bastante na solução desse problema é a função sscanf.

Eu já postei algo sobre a função sscanf, clique aqui para visualizar.

Esse problema é considerado um problema fácil, mas que pode complicar dependendo de como você irá pegar os dados. Como já falei anteriormente, a função sscanf lhe ajudará bastante pois ela irá pegar os dados de uma string para que você possa manipulá-los de acordo com a exigência do problema.

Os cálculos são bem simples, você só precisa calcular a distância percorrida em quilômetros. Lembre-se de que 1 hora corresponde a 3600 segundos.

Exemplo: se a velocidade é 100km/h, você quer saber qual a distância percorrida em 900 segundos, então faça:

3600 segundos corresponde a 100 km
900 segundos corresponde a x km

Através de uma regra de três simples você consegue obter a distância. No caso do nosso exemplo o valor de "x" será 25.

Veja o código:
(clique na imagem para vê-la em tamanho maior)


Uma alternativa para a condição do "while" seria:

cin.getline(dados, sizeof(dados)) != NULL

Na linha 13 utilizamos a função sscanf, essa função retorna a quantidade de variáveis que foram preenchidas com sucesso, essa quantidade é guardada na variável "num".

Na linha 15 calculamos o tempo em segundos. 1 hora corresponde a 3600 segundos e 1 minuto corresponde a 60 segundos.

Linha 16: cálculo da distância percorrida em quilômetros. É só dá uma olhada na regra de três que falei anteriormente. Lembrando que aqui temos (tempo - tempo_total), por que isso?

Veja que primeiro calculamos o "tempo" e utilizamos a subtração de "tempo" por "tempo_total" no cálculo da distância (dist). Isso acontece porque não queremos calcular toda a distância percorrida, mas apenas a distância percorrida em um determinado intervalo de tempo.

Nas linhas 18 e 19 armazenamos a somatória das distâncias e tempos.

A função sscanf retorna a quantidade de variáveis que foram preenchidas com sucesso não é mesmo? Então, se "num" for igual a 4 (linha 21) é porque temos 4 variáveis que foram preenchidas com sucesso, ou seja, temos uma nova velocidade já que a velocidade é a quarta variável. Se isso ocorrer, então a variável "vel" recebe "nova_vel" para calcularmos corretamente com base em uma nova velocidade.

Senão (se forem somente 3 variáveis preenchidas com sucesso) quer dizer que não temos a velocidade, então é a hora que o problema quer saber qual a distância percorrida até o momento. Para fazer isso, é só mostrar do jeito que o problema pede, não esquecer que a distância é a distância total, ou seja, utilizamos a variável "dist_total".

Por que "%02d" ? O 0 antes do 2 serve para que o printf preencha com zero à esquerda quando o número tiver apenas um algarismo significativo.

Então é isso pessoal, espero que tenham gostado da explicação, até a próxima!


Nenhum comentário: