Pesquisar este blog

Livros Recomendados

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

sábado, 20 de março de 2021

URI (BEECROWD) - 2812 - Laércio - Iniciante - C e C++

A solução para o problema Laércio está nesse post. Vou te mostrar como obter o aceite em duas linguagens, C e C++. Verifique na sequência do post!

Plataforma: URI (BEECROWD)

Problema2812


Linguagens: C e C++


Solução:

Utilizei uma estrutura array/vector para armazenar os valores (variável v) e depois a ordenei. Note uma expressão lógica interessante utilizando bitwise: v & 1. Muita gente me pergunta o que é isso. Essa expressão faz o mesmo que (v & 1) == 1. OK, mas o que é isso? O operador & faz o "e" lógico (and) bit a bit, também conhecido como bitwise. Portanto, de forma resumida, utilizamos & para verificar se um bit (o bit menos significativo) está setado. Quando o número for par, o último bit dele sempre será zero. Quando um número for ímpar, o último bit dele sempre será um. Portanto, esse teste identifica se o valor de "v" é ímpar. Se for impar, a condição é verdadeira.

Outro ponto a ser observado é a "limpeza" da estrutura array/vector. No caso do array, isso foi feito redefinindo os valores para zero com a função memset. No caso do vector, em C++, foi utilizada a função clear.

Código em C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compara(const void *a, const void *b) {
   return (*(int *)b - *(int *)a);
}
int main() {
    int n, m, v, i, j, k, x, lista[110];
    scanf("%d", &n);
    while (n--) {
        scanf("%d", &m);
        i = 0;
        while (m--) {
            scanf("%d", &v);
            if (v & 1)
                lista[i++] = v;
        }
        qsort(lista, i, sizeof(int), compara);
        k = i;
        j = i;
        i = 1;
        if (j >= 1) {
            printf("%d", lista[0]);
            for (x = 1; x < k; x++) {
                if (x & 1)
                    printf(" %d", lista[--j]);
                else
                    printf(" %d", lista[i++]);
            }
        }
        printf("\n");
        memset(lista, 0, sizeof(lista));
    }
    return 0;
}

Código em C++:

Em termos de raciocínio lógico para solucionar o problema, não há diferenças para o código em C, mas aqui utilizei a estrutura vector (necessário #include <vector>) e a função sort (necessário #include <algorithm>).

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
    int n, m, v, i, j, x;
    vector<int> lista;
    cin >> n;
    while (n--) {
        cin >> m;
        while (m--) {
            cin >> v;
            if (v & 1)
                lista.push_back(v);
        }
        sort(lista.begin(), lista.end(), greater<int>());
        j = lista.size();
        i = 1;
        if (j >= 1) {
            cout << lista.at(0);
            for (x = 1; x < lista.size(); x++) {
                if (x & 1)
                    cout << " " << lista.at(--j);
                else
                    cout << " " << lista.at(i++);
            }
        }
        cout << endl;
        lista.clear();
    }
    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