Pesquisar este blog

Livros Recomendados

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

quarta-feira, 17 de fevereiro de 2021

URI (BEECROWD) - 1547 - Adivinha - Ad-Hoc - C e C++

Novo problema Ad-hoc! O título desse é "Adivinha". Confere abaixo as soluções para este exercício.

Plataforma: URI (BEECROWD)

Problema1547

Enunciado:

O professor Genesio recebeu várias camisetas da OBI (Organização dos Bacharéis Intelectuais) para doar a seus alunos de Ciência da Computação. Para fazer a distribuição destas camisetas ele organizou os alunos de cada turma do curso em pequenos grupos (de no máximo 10 pessoas) e definiu que faria o sorteio de uma camiseta para cada um dos grupos. Como Genesio não quer perder muito tempo com este sorteio, ele pediu que você o ajudasse com um programa que determinasse quem foi o aluno ganhador de acordo com a seguinte regra: O primeiro de cada grupo a acertar um número escolhido pelo professor obviamente ganha a camiseta, mas se ninguém acertar este número, ganha a camiseta o primeiro que chegar o mais próximo deste número.

Não faz diferença quem do grupo o professor escolhe para tentar iniciar a adivinhação. Este sempre será o aluno número 1, e assim sucessivamente.


Linguagens: C e C++


Solução:

Código em C:

Basta testar se o valor lido nas iterações é igual ao valor informado junto com a quantidade. Se for, acrescenta a posição dele. Utilizei para controle também uma variável menor, assim quando isso acontecer uma vez ele não entra de novo na estrutura condicional if. Se eles não forem iguais, é necessário pegar a diferença absoluta entre os valores v e s. Eu criei minha própria função abs. Aliás, fica a sugestão para criá-la utilizando operador ternário!

#include <stdio.h>
int abs(int a) {
    if (a < 0)
        return -a;
    return a;
}
int main() {
    int n, qt, s, i, v, menor, pos, dif;
    scanf("%d", &n);
    while (n--) {
        scanf("%d %d", &qt, &s);
        for (i = 0, menor = 100; i < qt; i++) {
            scanf("%d", &v);
            if (v == s && menor) {
                pos = i + 1;
                menor = 0;
            }
            else {
                dif = abs(v-s);
                if (dif < menor) {
                    menor = dif;
                    pos = i + 1;
                }
            }
        }
        printf("%d\n", pos);
    }
    return 0;
}

Código em C++:

Só pra não deixar totalmente igual, não usei a variável dif e aproveitei a função abs já definida em cmath aqui.

#include <iostream>
#include <cmath>
using namespace std;
int main() {
    int n, qt, s, i, v, menor, pos;
    cin >> n;
    while (n--) {
        cin >> qt >> s;
        for (i = 0, menor = 100; i < qt; i++) {
            cin >> v;
            if (v == s && menor) {
                pos = i + 1;
                menor = 0;
            }
            else if (abs(v-s) < menor) {
                menor = abs(v-s);
                pos = i + 1;
            }
        }
        cout << pos << endl;
    }
    return 0;
}

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