Pesquisar este blog

Livros Recomendados

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;
}

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