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)
Problema: 2812
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; }
#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; }