Pesquisar este blog

Livros Recomendados

segunda-feira, 15 de fevereiro de 2021

URI (BEECROWD) - 1514 - Competição - Ad-Hoc - C e C++

O exercício Competição, do Beecrowd, foi resolvido e aqui estou para divulgar minha solução para vocês. Este exercício faz parte da categoria Ad-hoc.

Plataforma: URI (BEECROWD)

Problema1514

Enunciado:

A maioria dos programadores que chegam a escrever competições com exercícios de programação concordam em quatro características que toda competição deve alcançar. Embora nem todas sejam sempre alcançadas, quanto mais melhor. As características são as seguintes: 

  1. Ninguém resolveu todos os problemas.
  2. Todo problema foi resolvido por pelo menos uma pessoa (não necessariamente a mesma).
  3. Não há nenhum problema resolvido por todos.
  4. Todos resolveram ao menos um problema (não necessariamente o mesmo).

Rafael organizou uma competição alguns dias atrás, e está preocupado com quantas dessas características ele conseguiu alcançar com a competição.

Dadas as informações sobre a competição, com o número de participantes, número de problemas, e qual participante resolveu quais problemas, descubra o número de características que foram alcançadas nesta competição.


Linguagens: C e C++


Solução:

Ao ler todos os valores, já verifiquei se para cada jogador havia algum que tinha acertado todos os problemas ou se não tinha acertos. Estes dois casos já estão entre as características solicitadas. Caso sejam satisfeitos, a variável r (que conterá a resposta final) é incrementada.

Depois disso, verifiquei os problemas: primeiro, se há algum problema para o qual ninguém acertou, e depois outro laço de repetição para verificar se todos acertaram algum dos problemas. 

Código em C:

#include <string.h>
#include <stdio.h>
int main() {
    int n, m, i, j, v, quant, r, acertos[100000], acertouTodos, nenhumAcerto, problemaSemAcerto, todosAcertaram;
    while (scanf("%d %d", &n, &m) != EOF) {
        if (!n && !m)
            break;
        acertouTodos = 0;
        nenhumAcerto = 0;
        problemaSemAcerto = 0;
        todosAcertaram = 0;
        r = 0;
        for (i = 0; i < n; i++) {
            quant = 0;
            for (j = 0; j < m; j++) {
                scanf("%d", &v);
                acertos[j] += v;
                quant += v;
            }
            if (quant == m) 
                acertouTodos = 1;
            if (!quant)
                nenhumAcerto = 1;
        }
        
        if (!acertouTodos)
            r++;
        if (!nenhumAcerto)
            r++;
        for (i = 0; i < m; i++) {
            if (!acertos[i]) {
                problemaSemAcerto = 1;
                break;
            }
        }
        for (i = 0; i < m; i++) {
            if (acertos[i] == n) {
                todosAcertaram = 1;
                break;
            }
        }
        if (!problemaSemAcerto)
            r++;
        if (!todosAcertaram)
            r++;
        printf("%d\n", r);
        memset(acertos, 0, sizeof(acertos));
    }
    return 0;
}

Código em C++:
O caminho da solução aqui aplicado é igual ao do código em C!

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int main() {
    int n, m, i, j, v, quant, r, acertos[100000];
    bool acertouTodos, nenhumAcerto, problemaSemAcerto, todosAcertaram;
    while (cin >> n >> m) {
        if (!n && !m)
            break;
        acertouTodos = false;
        nenhumAcerto = false;
        problemaSemAcerto = false;
        todosAcertaram = false;
        r = 0;
        for (i = 0; i < n; i++) {
            quant = 0;
            for (j = 0; j < m; j++) {
                cin >> v;
                acertos[j] += v;
                quant += v;
            }
            if (quant == m) 
                acertouTodos = true;
            if (!quant)
                nenhumAcerto = true;
        }
        
        if (!acertouTodos)
            r++;
        if (!nenhumAcerto)
            r++;
        for (i = 0; i < m; i++) {
            if (!acertos[i]) {
                problemaSemAcerto = true;
                break;
            }
        }
        for (i = 0; i < m; i++) {
            if (acertos[i] == n) {
                todosAcertaram = true;
                break;
            }
        }
        if (!problemaSemAcerto)
            r++;
        if (!todosAcertaram)
            r++;
        cout << r << endl;
        memset(acertos, 0, sizeof(acertos));
    }
    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