Pesquisar este blog

Livros Recomendados

quarta-feira, 20 de dezembro de 2023

URI (BEECROWD) - 3049 - Nota Cortada - Matemática - C, C++ e Haskell

Novamente, post de exercício de Matemática! Esse é o exercício Nota Cortada. Achei ele bem interessante, bom pra quem está iniciando em programação. 

Plataforma: URI (BEECROWD)

Problema3049

Linguagens: C, C++ e Haskell

Enunciado:

Se pegarmos uma nota de 100 reais e a cortarmos, usando uma tesoura, em dois pedaços, quanto vale cada um dos pedaços? A regra é simples: se um dos pedaços possuir estritamente mais da metade da área da nota original, então ele vale 100 reais; e o outro pedaço não vale nada. Veja que se cada pedaço possuir exatamente metade da área original, então nenhum dos dois tem valor.

Felix e Marzia decidiram fazer um corte, em linha reta, que comece no lado inferior da nota, a base, e termine no lado superior, o topo. A nota é um retângulo de comprimento 160 centímetros e altura 70 centímetros, como mostrado na parte esquerda da figura abaixo. Felix sempre vai ficar com o pedaço mais à esquerda da nota e Marzia com o pedaço mais à direita. A parte direita da figura ilustra dois possíveis cortes. No de cima, Marzia ficaria claramente com o maior pedaço, que vale 100 reais; e no de baixo, dá para ver que Felix é quem ficaria com o maior pedaço.

O corte reto vai começar na base a uma distância de B centímetros a partir do lado esquerdo da nota; e terminar no topo a uma distância de T centímetros também a partir do lado esquerdo da nota. Veja a indicação na parte direita da figura.

Neste problema, dados os valores B e T, seu programa deve computar quem vai ficar com o pedaço que vale 100 reais, ou se o valor da nota se perdeu.

Solução:

A lógica desse problema é simples. Após ler os valores, é necessário somá-los e identificar se são maiores que 160 (caso 1), menores (caso 2) ou então a resposta é zero. Também pode ser feito calculando a área cortada, mas isso não é necessário. Eu fiz das duas formas em C, veja abaixo!

Código em C:

Solução 1:

#include <stdio.h> 

int main() {
    int b;
    int t;
    scanf("%d", &b);
    scanf("%d", &t);
    if (b + t > 160)
        printf("1\n");
    else if (b + t < 160)
        printf("2\n");
    else
        printf("0\n");
    return 0; 
}

Solução 2:

#include <stdio.h> 
int main() {
    const double metade = 5600.0;
    double area = 11200.0;
    double h = 70.0;
    double l = 160.0;
    double b;
    double t;
    double areaCortadaEsq;
    scanf("%lf", &b);
    scanf("%lf", &t);
    if (b < t)
        areaCortadaEsq = b * h + ((t - b) * h) / 2;
    else if (b > t)
        areaCortadaEsq = t * h + ((b - t) * h) / 2;
    else
        areaCortadaEsq = t * h;
    if (areaCortadaEsq > metade)
        printf("1\n");
    else if (areaCortadaEsq < metade)
        printf("2\n");
    else
        printf("0\n");
    return 0; 
}

Código em C++
:

Código semelhante à solução 1 em C apresentada.

#include <iostream> 

int main() {
    int b;
    int t;
    std::cin >> b;
    std::cin >> t;
    if (b + t > 160)
        std::cout << "1" << std::endl;
    else if (b + t < 160)
        std::cout << "2" << std::endl;
    else
        std::cout << "0" << std::endl;
    return 0; 
}

Código em Haskell:

pegaMaiorParte :: Int -> Int -> Int
pegaMaiorParte a b
   | a + b > 160 = 1
   | a + b < 160 = 2
   | otherwise = 0

main :: IO ()
main = do
   b <- readLn
   t <- readLn
   print (pegaMaiorParte b t)

Espero mais uma vez que tenham gostado! Chave aleatória para doações, caso alguém possa contribuir: 6d8bc7a8-5d74-493a-ab7a-3515baf35956. Agradeço novamente!

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