Departamento de Ciência da
Computação - IME - USP
"Ka-chow!"
Relâmpago McQueen, no filme Carros
O objetivo do primeiro exercício-programa consiste em familiarizar os alunos com manipulação de números inteiros, operadores matemáticos, lógicos e laços. Note que para resolver esse exercício você só poderá utilizar o conteúdo visto em sala de aula.
Ralis de regularidade são competições automobilísticas em que, como o próprio nome sugere, a regularidade conta mais do que a velocidade. As equipes, geralmente formadas por alguém que dirige o carro e por alguém que age como navegador(a), precisam passar por vários checkpoints dentro de prazos estabelecidos. Vence quem terminar a prova tendo chegado o mais perto possível dos prazos estabelecidos em todos os checkpoints.
![]() |
Os organizadores de um determinado rali de regularidade estão precisando automatizar a verificação dos tempos das equipes em uma competição e pediram a sua ajuda. Cada carro será equipado com dispositivos de GPS capazes de atestar a localização exata e a hora exata a cada momento. Alguns minutos antes da prova começar, as equipes receberão a latitude e longitude de cada checkpoint, com a observação de que o tempo esperado para a passagem no checkpoint i, com i começando em 1, é i horas, 0 minutos e 0 segundos. A cada passagem por um checkpoint, a diferença entre o instante atual e o instante esperado deve ser acumulado individualmente para cada equipe. Ao término da prova, a equipe que tiver o menor tempo acumulado vence a prova, a equipe que tiver o segundo menor tempo acumulado fica em segundo lugar e a equipe que tiver o terceiro menor tempo acumulado fica em terceiro lugar.
Cada uma das três primeiras equipes receberá um prêmio em dinheiro dessa forma:
Além disso, você sugeriu, e a organização da prova topou, que equipes que demonstrem um conhecimento matemático apurado recebam uma premiação maior. A proposta aceita foi de que, se o tempo acumulado, em segundos, da primeira equipe for um número primo, a premiação dela deve ser dobrada, mas isso vale apenas para a equipe que ficar em primeiro lugar.
Neste EP, a sua tarefa será receber a quantidade de equipes participantes (no mínimo 3 e no máximo 90), a quantidade de checkpoints (no mínimo 2 e no máximo 90) e os tempos em que cada equipe passou por cada checkpoint no formato horas:minutos:segundos. Considere ainda que o máximo de tempo acumulado que uma equipe terá será 100 horas. Você não precisa se preocupar em verificar se a equipe cumpriu essa regra pois nos casos em que a equipe tiver alguma falha que impeça ela de cumprir esse tempo limite, o tempo que será informado será -1:-1:-1 em todos os checkpoints a partir daquele que a equipe não conseguiu cumprir. Nesse caso, a equipe será desclassificada.
Por exemplo, se a prova tiver 4 checkpoints e os instantes de tempo de uma equipe forem:
Nessa mesma prova, abaixo está uma sequência de instantes de tempo de uma equipe que foi desclassificada:
Considere que o programa receba inicialmente dois números inteiros que são referentes à quantidade de equipes (E) e à quantidade de checkpoints (C). Em seguida, o programa recebe E x C instantes de tempo no formato horas:minutos:segundos sendo que os valores de horas, minutos e segundos são números inteiros respeitando o intervalo de horas de 0 a 99, de minutos de 0 a 59 e de segundos também de 0 a 59.
Como visto até o momento em sala de aula, a entrada de dados em um programa em C é feita com a função scanf. Na sua forma mais simples, o scanf recebe um único número inteiro seguido de ENTER. Como neste EP é necessário ler uma linha inteira contendo horas:minutos:segundos, nesse formato, seguido de ENTER, o scanf precisa ser usado de forma a especificar que serão lidos três números inteiros separados por dois pontos. Isso é feito assim:
scanf("%d:%d:%d", &variavel1, &variavel2, &variavel3);
Onde variavel1, variavel2 e variavel3 são as variáveis onde os valores das horas, minutos e segundos serão armazenados (Não chame as variáveis de variavel1, variavel2 e variavel3! Isso é apenas um exemplo. Use nomes de variáveis que façam sentido considerando o que elas vão armazenar).
A saída do programa é uma lista apresentando quais foram as equipes que ficaram nas três primeiras posições e quanto cada uma ganhou. Considere que o identificador da equipe seja a ordem em que os tempos dela foram informados, começando de zero. Em casos de empate, a última equipe que teve os seus dados informados deve vencer o empate.
Importante: Você não precisa se preocupar com situações em que o usuário não digite os valores esperados. A correção do EP não levará em conta essas situações. Portanto, se o seu programa explodir caso o usuário passe por exemplo letras no lugar dos números dos tempos ou valores negativos para a quantidade de equipes, não tem problema.
Nos exemplos, tudo que aparece em vermelho e negrito foi digitado pelo usuário. O resto foi impresso na tela pelo programa.
digite a quantidade de equipes: 3
digite a quantidade de checkpoints: 2
digite os tempos de passagem nos checkpoints da equipe 0:
01:00:00
02:00:12
digite os tempos de passagem nos checkpoints da equipe 1:
01:01:01
01:59:13
digite os tempos de passagem nos checkpoints da equipe 2:
01:00:00
02:00:13
[RESULTADO]
Equipe em primeiro lugar: 0
>>> Ganhou 500000 Reais
Equipe em segundo lugar: 2
>>> Ganhou 200000 Reais
Equipe em terceiro lugar: 1
>>> Ganhou 50000 Reais
digite a quantidade de equipes: 3
digite a quantidade de checkpoints: 2
digite os tempos de passagem nos checkpoints da equipe 0:
01:00:00
02:00:13
digite os tempos de passagem nos checkpoints da equipe 1:
01:01:01
-1:-1:-1
digite os tempos de passagem nos checkpoints da equipe 2:
01:00:00
-1:-1:-1
[RESULTADO]
Equipe em primeiro lugar: 0
>>> Ganhou 1000000 Reais
Equipe em segundo lugar: nenhuma
Equipe em terceiro lugar: nenhuma
digite a quantidade de equipes: 3
digite a quantidade de checkpoints: 2
digite os tempos de passagem nos checkpoints da equipe 0:
-1:-1:-1
-1:-1:-1
digite os tempos de passagem nos checkpoints da equipe 1:
01:01:01
-1:-1:-1
digite os tempos de passagem nos checkpoints da equipe 2:
01:00:00
-1:-1:-1
[RESULTADO]
Equipe em primeiro lugar: nenhuma
Equipe em segundo lugar: nenhuma
Equipe em terceiro lugar: nenhuma
digite a quantidade de equipes: 6
digite a quantidade de checkpoints: 4
digite os tempos de passagem nos checkpoints da equipe 0:
01:00:00
02:20:12
03:00:45
03:50:57
digite os tempos de passagem nos checkpoints da equipe 1:
01:01:01
01:59:13
02:59:00
04:19:00
digite os tempos de passagem nos checkpoints da equipe 2:
01:00:00
02:00:13
03:09:48
04:00:00
digite os tempos de passagem nos checkpoints da equipe 3:
00:58:45
02:10:00
03:10:00
04:10:00
digite os tempos de passagem nos checkpoints da equipe 4:
00:50:00
02:17:00
03:00:00
04:00:00
digite os tempos de passagem nos checkpoints da equipe 5:
01:01:01
02:02:02
03:03:03
-1:-1:-1
[RESULTADO]
Equipe em primeiro lugar: 2
>>> Ganhou 1000000 Reais
Equipe em segundo lugar: 1
>>> Ganhou 200000 Reais
Equipe em terceiro lugar: 4
>>> Ganhou 50000 Reais
Atenção: imprima os textos informativos ao usuário exatamente da mesma forma que apresentado nos exemplos de execução acima. Não remova nenhuma palavra, nenhum espaço e nenhuma pontuação, não adicione acentos ou textos a mais e não mude letras maiúsculas para minúsculas ou vice-versa, pois qualquer uma dessas mudanças atrapalha o avaliador automático.
O arquivo a ser entregue deve ser nomeado como ep1.c, com todos os caracteres minúsculos.
Note que para resolver esse exercício você só poderá utilizar o conteúdo visto em sala de aula.
O seu código deve ser claro, enxuto, bem organizado e os nomes das variáveis devem revelar a sua intenção, i.e., o significado do valor que elas guardam.
Leia as INFORMAÇÕES SOBRE ENTREGA DE EPs antes de entregar o seu EP. Lendo as informações você verá, por exemplo, que o seu EP deve ter um cabeçalho específico.
Certifique-se de que o seu programa foi realmente depositado no site.