Advertisement
Diogo03

Untitled

Apr 2nd, 2025 (edited)
471
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.38 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. /*
  4.     Ideia geral:
  5.     Dado um array de numeros inteiros distintos, devemos dividi-lo em tres conjuntos nao vazios
  6.     com as seguintes propriedades:
  7.       - O produto dos numeros do primeiro conjunto deve ser negativo (< 0).
  8.       - O produto dos numeros do segundo conjunto deve ser positivo (> 0).
  9.       - O produto dos numeros do terceiro conjunto deve ser zero.
  10.    
  11.     Estrategia:
  12.       1. Separa os numeros em tres categorias: negativos, positivos e zeros.
  13.       2. Seleciona um numero negativo para o primeiro conjunto, garantindo um produto negativo.
  14.       3. Para o segundo conjunto, se houver numeros positivos, adiciona todos eles. Em seguida,
  15.          adiciona os negativos restantes de forma que o total de negativos no conjunto seja par,
  16.          assegurando um produto positivo.
  17.       4. Os numeros restantes (inclusive zeros e, se necessario, um negativo extra) sao colocados
  18.          no terceiro conjunto, garantindo que seu produto seja zero.
  19. */
  20.  
  21. // Le recursivamente os elementos do array
  22. void ler_array(int a[], int n, int i) {
  23.     if(i >= n) return;
  24.     scanf("%d", &a[i]);
  25.     ler_array(a, n, i + 1);
  26. }
  27.  
  28. // Imprime recursivamente os elementos do array
  29. void print_array(int a[], int n, int i) {
  30.     if(i >= n) return;
  31.     printf("%d ", a[i]);
  32.     print_array(a, n, i + 1);
  33. }
  34.  
  35. // Separa o array a em tres arrays negativos, positivos e zeros
  36. void particiona(int a[], int n, int i, int negs[], int neg_size[], int pos[], int pos_size[], int zeros[], int zero_size[]) {
  37.     if(i >= n) return;
  38.     if(a[i] < 0) {
  39.         negs[neg_size[0]++] = a[i];
  40.     } else if(a[i] > 0) {
  41.         pos[pos_size[0]++] = a[i];
  42.     } else {
  43.         zeros[zero_size[0]++] = a[i];
  44.     }
  45.     particiona(a, n, i + 1, negs, neg_size, pos, pos_size, zeros, zero_size);
  46. }
  47.  
  48. // Copia recursivamente elementos do array original para destino do indice inicio ate fim
  49. void copia_intervalo(int original[], int inicio, int fim, int destino[], int dest_index[]) {
  50.     if(inicio >= fim) return;
  51.     destino[dest_index[0]++] = original[inicio];
  52.     copia_intervalo(original, inicio + 1, fim, destino, dest_index);
  53. }
  54.  
  55. int main() {
  56.     int n;
  57.     scanf("%d", &n);
  58.     int a[n];
  59.     ler_array(a, n, 0);
  60.  
  61.     // Arrays para separar numeros negativos, positivos e zeros
  62.     int negs[105], pos[105], zeros[105];
  63.     int neg_size[1] = {0}, pos_size[1] = {0}, zero_size[1] = {0};
  64.     particiona(a, n, 0, negs, neg_size, pos, pos_size, zeros, zero_size);
  65.    
  66.     // Arrays para armazenar os conjuntos finais
  67.     int set_neg, set_pos[105], set_zero[105];
  68.     int set_pos_size[1] = {0}, set_zero_size[1] = {0};
  69.  
  70.     // Primeiro conjunto contem um numero negativo para garantir produto < 0
  71.     set_neg = negs[0];
  72.    
  73.     // Resto dos negativos apos usar um no primeiro conjunto
  74.     int rem_neg[105];
  75.     int rem_neg_size[1] = {0};
  76.     copia_intervalo(negs, 1, neg_size[0], rem_neg, rem_neg_size);
  77.    
  78.     if(pos_size[0] > 0) {
  79.         // Segundo conjunto inicia com todos os numeros positivos
  80.         copia_intervalo(pos, 0, pos_size[0], set_pos, set_pos_size);
  81.        
  82.         // Se quantidade de negativos restantes for par, podem ser adicionados ao segundo conjunto
  83.         if(rem_neg_size[0] % 2 == 0) {
  84.             copia_intervalo(rem_neg, 0, rem_neg_size[0], set_pos, set_pos_size);
  85.         } else {
  86.             // Se for impar, adiciona todos, exceto o ultimo, no segundo conjunto
  87.             copia_intervalo(rem_neg, 0, rem_neg_size[0] - 1, set_pos, set_pos_size);
  88.             // O ultimo negativo vai para o terceiro conjunto para manter o produto zero
  89.             copia_intervalo(rem_neg, rem_neg_size[0] - 1, rem_neg_size[0], set_zero, set_zero_size);
  90.         }
  91.     } else {
  92.         // Se nao ha numeros positivos, adiciona dois negativos no segundo conjunto
  93.         copia_intervalo(rem_neg, 0, 2, set_pos, set_pos_size);
  94.         // O restante dos negativos vai para o terceiro conjunto
  95.         copia_intervalo(rem_neg, 2, rem_neg_size[0], set_zero, set_zero_size);
  96.     }
  97.  
  98.     // Adiciona todos os zeros no terceiro conjunto
  99.     copia_intervalo(zeros, 0, zero_size[0], set_zero, set_zero_size);
  100.  
  101.     printf("1 %d\n", set_neg);
  102.    
  103.     printf("%d ", set_pos_size[0]);
  104.     print_array(set_pos, set_pos_size[0], 0);
  105.     printf("\n");
  106.    
  107.     printf("%d ", set_zero_size[0]);
  108.     print_array(set_zero, set_zero_size[0], 0);
  109.     printf("\n");
  110.    
  111.     return 0;
  112. }
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement