Pesquisar este blog

Livros Recomendados

domingo, 4 de abril de 2021

URI (BEECROWD) - 2174 - Coleção de Pomekon - Strings - C e C++

Pra quem não conhece a estrutura set, esse exercício é uma boa oportunidade de conhecer! Além de ajudar muito, o set (ou conjunto disjunto) trabalha da mesma forma que os conjuntos matemáticos, aqueles mesmos que aprendemos no ensino fundamental. Bora ver a solução?

Antes de resolver qualquer algoritmo do URI (BEECROWD agora), recomendamos seguir os seguintes passos:

  1. Ler todo enunciado do problema.
  2. Ler os tópicos do fórum em caso de dúvidas
  3. Preparar arquivos de entrada para teste, considerando as entradas de exemplo do URI, do udebug e outros valores limite;
  4. Preparar o ambiente de desenvolvimento e utilizar os mesmos parâmetros dos compiladores do URI
  5. Preparar um código-fonte padrão, já contendo a chamada às bibliotecas padrão, pré-processadores, retorno de função e um comando de escrita com "\n", pois no URI a grande maioria dos problemas exige a quebra de linha final.

Plataforma: URI (BEECROWD)

Problema2174

Enunciado:

Desde que foi lançado oficialmente o Pomekon no Brasil, Dabriel está tentando realizar seu maior sonho: Ser um Mestre Pomekon. Sua meta é conquistar os 151 Pomekons disponíveis. Ele já conseguiu capturar muitos monstrinhos, porém em sua cidade aparecem muitos Pomekons repetidos, fazendo com que ele capture diversas vezes o mesmo Pomekon.

Vendo que sua mochila está bem cheia, Dabriel pediu para que você fizesse um programa de computador que informasse a ele quantos Pomekons faltam para completar a coleção.

Linguagens: C e C++

Solução em C:

A ideia é armazenar os pomekons em uma matriz de caracteres, ou seja, o que seria um array de palavras. No entanto, essa solução pura permitiria contar pomekons duplicados. Portanto, realizou-se a ordenação do array de palavras em ordem alfabética e comparou-se, assim, cada pomekon com o pomekon anterior. Se os nomes fossem diferentes, incrementa o contador (variável "r"). A resposta final é a subtração 151 - r, ou seja, 151 menos o total de pomekons diferentes lidos pelo programa.

Observações: Quicksort é um algoritmo de ordenação estável, disponível na biblioteca stdlib através da função qsort. Caso prefira, você pode implementar sua própria função de ordenação para resolver este exercício. A função strcmp realiza a comparação entre duas cadeias de caracteres.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 1010

int compara(const void *p1, const void *p2) {
    return strcmp(p1, p2);
}

int main() {
    
    unsigned int n, i, r = 1;
    char pomekon[MAX][MAX];

    scanf("%u", &n);
    for (i = 0; i < n; i++)
        scanf("%s", pomekon[i]);
    
    qsort(pomekon, n, MAX, compara);
    
    for (i = 1; i < n; i++) {
        if (strcmp(pomekon[i-1], pomekon[i]))
            r++;
    }
    
    printf("Falta(m) %u pomekon(s).\n", 151 - r);

    return 0;
}

Solução em C++:

A ideia é inserir cada pomekon em uma estrutura set (conjunto), garantindo que assim não haverá elementos repetidos. A função size terá o número de elementos do conjunto, bastando, portanto, subtrair este valor de 151 para saber quantos pomekons faltam. É necessário quebrar a linha no comando de escrita (endl;).


#include <iostream>
#include <set>

using namespace std;

int main() {
    
    unsigned int n;
    string pomekon;
    set<string> pomekons;

    cin >> n;
    while (n--) {
        cin >> pomekon;
        pomekons.insert(pomekon);
    }
    
    cout << "Falta(m) " << 151 - pomekons.size() << " pomekon(s)." << endl;

    return 0;
}

Um comentário:

  1. Boa noite, não achei o contato do site de vocês em nenhum lugar, então gostaria de contribuir com o URI 1400 em c, pois me foi pedido e eu tive dificuldades de encontrar a resposta, segue abaixo::

    URI 1400
    #include
    #include
    #include




    #define sc3(a,b,c) scanf("%d %d %d", &a, &b, &c)
    #define for(i,a,n) for(int (i) = (a); (i) < (n); (i)++)

    bool clap(int n)
    {
    if(n % 7 == 0)
    return true;

    while (n)
    {
    int r = n % 10;
    n /= 10;

    if (r == 7)
    return true;
    }

    return false;
    }

    int main(void)
    {
    int n, m, k, p, agr, v;

    while(sc3(n,m,k) && (n || m || k))
    {
    p = v = 1;
    agr = 0;

    while(1)
    {
    agr++;

    if(p == m && clap(agr)){
    k--;
    if(k == 0){
    printf("%d\n", agr);
    break;
    }
    }

    p += v;

    if (p > n) {
    p = n - 1;
    v = -1;
    } else if (p == 0){
    p = 2;
    v = 1;
    }
    }
    }

    return 0;
    }

    ResponderExcluir

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