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)
Problema: 3049
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; }
#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; }
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)
Nenhum comentário:
Postar um comentário