Pesquisar este blog

Livros Recomendados

terça-feira, 23 de fevereiro de 2021

URI (BEECROWD) - 1708 - Volta - Ad-Hoc - C e C++

Vamos de mais um exercício ad-hoc do Beecrowd? Bora conferir os meus códigos para o problema "Volta", em C, Haskell e C++! Verifique na sequência do post! Originalmente o post tinha só solução em C e C++, mas incrementei colocando também a de Haskell.

Plataforma: URI (BEECROWD)

Problema1708

Enunciado:

No automobilismo é bastante comum que o líder de uma prova, em determinado momento, ultrapasse o último colocado. O líder, neste momento, está uma volta à frente do último colocado, que se torna, assim, um retardatário. Neste problema, dados os tempos que o piloto mais rápido e o piloto mais lento levam para completar uma volta, você deve determinar em que volta o último colocado se tornará um retardatário, ou seja, será ultrapassado pelo líder. Você deve considerar que, inicialmente, eles estão lado a lado, na linha de partida do circuito, ambos no início da volta de número 1 (a primeira volta da corrida); e que uma nova volta se inicia sempre depois que o líder cruza a linha de partida.

Linguagens: C, C++ e Haskell

Solução:

Após ler os valores, armazenei o menor entre eles em uma variável (chamada "menor"). Para esta atribuição eu usei o operador ternário, poupando assim algumas linhas de código. Também criei uma variável para calcular a diferença absoluta entre os valores, e chamei ela de "dif". Para saber a volta que o piloto se torna retardatário eu preciso ir somando (acumulando) esta diferença em uma variável, assim, quando ela for maior que o valor de "menor" significa que o piloto mais lento foi ultrapassado pelo piloto mais rápido. A cada iteração ocorre a acumulação de valor na variável v e um contador de voltas (variável "r") é incrementado. Ao final, r+1 será a resposta.

Código em Haskell (NOVO!):

obtemResposta :: Int -> Int -> Int -> Int -> Int
obtemResposta r v d m
   | v >= m = r
   | otherwise = obtemResposta (r+1) (v+d) d m

main :: IO ()
main = do
    line <- getLine
    let [x, y] = map read (words line) :: [Int]
        menor = if x < y then x else y
        diferenca = if x - y < 0 then -(x - y) else x - y
        r = obtemResposta 1 diferenca diferenca menor
    print (r + 1)


Código em C:

#include <stdio.h>
int main() {
    int x, y, menor, r, v, dif;
    scanf("%d %d", &x, &y);
    menor = (x < y? x : y);
    dif = (x - y < 0? - (x - y) : x - y);
    for (r = 1, v = dif; v < menor; r++, v += dif);
    printf("%d\n", r + 1);
    return 0;
}

Código em C++:

#include <iostream>
int main() {
    int x, y, menor, r, v, dif;
    std::cin >> x >> y;
    menor = (x < y? x : y);
    dif = (x - y < 0? - (x - y) : x - y);
    for (r = 1, v = dif; v < menor; r++, v += dif);
    std::cout << r + 1 << std::endl;
    return 0;
}

Nenhum comentário:

Postar um comentário

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas