Pesquisar este blog

Livros Recomendados

Mostrando postagens com marcador 2567. Mostrar todas as postagens
Mostrando postagens com marcador 2567. Mostrar todas as postagens

domingo, 17 de dezembro de 2023

URI (BEECROWD) - 2567 - Vírus - Ad-Hoc - C, C++ e Haskell

Aqui vai mais uma solução, pessoal! O problema Vírus ainda não tinha sido resolvido por mim.  Ele é bem simples, basicamente precisa usar ordenação. Fiz ele em três linguagens, aquelas três que eu mais uso por aqui... então, vamos ao que interessa!

Plataforma: Beecrowd (antiga URI)

Problema2567

Enunciado:

A secretaria de saúde pública da Nlogônia acabou de emitir um alerta. Um vírus está contagiando toda a população.

Após muitos estudos, os pesquisadores do país determinaram que, após infiltrarem o corpo hospedeiro, os virus se juntam dois a dois para tornarem-se letais. O nível de letalidade de uma infecção é determinado pela soma da diferença da idade, em dias, dos vírus pareados. Os vírus sem pares não influenciam no nível.

Desta forma, se existem 4 vírus no corpo hospedeiro com idades (em dias), iguais a

4, 10, 9, 43

E eles se paream da seguinte forma:

4 com 9, 43 com 10

Então nível de letalidade seria (9 - 4) + (43 - 10) = 38.

A secretaria de saúde pública da Nlogônia pediu para que você escrevesse um programa que, dado a contagem de vírus em um corpo e a idade de cada um deles, calcule o nível máximo de letalide que a infecção pode assumir.

Linguagens: C, C++ e Haskell

Solução:

Nesse exercício, portanto, bastava unir os valores dois a dois, sempre o maior com o menor e assim por diante, subtraindo e acumulando a resposta. É muito fácil! Pra isso, resolvi com ordenação, mas há outras formas de resolver. E você, como fez? Veja na sequência os três códigos disponíveis em C, C++ e Haskell.

Código em C++:

Aqui eu acabei usando uma estrutura vector para armazenar os valores e depois ordenei esses valores da estrutura com a função pronta sort, da biblioteca algorithm. Após essa ordenação, casei os valores inicial e final, depois o segundo e o penúltimo, e assim por diante, para fazer a subtração desejada no exercício, acumulando esses resultados e obtendo assim a resposta final.

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main () {
   int n;
   while (cin >> n) {
      vector<int> valores;
      int v;
      for (int i = 0; i < n; i++) {
         cin >> v;
         valores.push_back(v);
      }
      sort(valores.begin(), valores.end());
      int metade = n / 2;
      int resposta = 0;
      for (int i = 0; i < metade; i++ )
         resposta += valores.at(n-i-1) - valores.at(i);
      cout << resposta << endl;
   }
   return 0;
}

Código em C:

Aqui eu usei a função pronta qsort, de stdlib.h, e só criei a função compara para dizer como deve ser a comparação entre os valores. Isso porque após ordenar, basta unir sempre os pares do primeiro com o último, o segundo com o penúltimo e assim por diante.

#include <stdio.h>
#include <stdlib.h>
int compara(const void *a, const void *b) {
   return (*(int*)a - *(int*)b);
}

int main () {
   int n;
   while (scanf("%d", &n) != EOF) {
      int valores[n];
      for (int i = 0; i < n; i++)
         scanf("%d", &valores[i]);
      qsort(valores, n, sizeof(int), compara);
      int metade = n / 2;
      int resposta = 0;
      for (int i = 0; i < metade; i++ )
         resposta += valores[n-i-1] - valores[i];
      printf("%d\n", resposta);
   }
   return 0;
}

Código em Haskell:

A lógica adotada no código Haskell foi a mesma. Aqui também há função pronta para ordenação, bem como há função pronta para obter o primeiro valor de uma lista (init) como o último valor (last), o que facilita nessa junção de valores.

import Data.List (sort)
import System.IO (isEOF)

obtemResposta :: [Int] -> Int
obtemResposta [] = 0
obtemResposta (x:[]) = 0
obtemResposta (x:xs) = last xs - x + obtemResposta (init xs)

main :: IO ()
main = do
   concluido <- isEOF
   if concluido
      then return ()
      else do
         n <- readLn :: IO Int
         linha <- getLine
         let valores = map read (words linha) :: [Int]
         let valoresOrdenados = sort valores
         let resposta = obtemResposta valoresOrdenados
         print resposta
         main

Apoie o blog colaborando com qualquer quantia. A chave pix (chave aleatória) é 6d8bc7a8-5d74-493a-ab7a-3515baf35956

Obrigado!

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