Sous-ensemble de produits minimum d'un tableau

01 May 2019 01 May 2019 9485 vues ESSADDOUKI Mostafa 4 min de lecture
Problème Étant donné un tableau a, nous devons trouver le produit minimum possible avec le sous-ensemble d'éléments présents dans le tableau. Le produit minimum peut être un seul élément aussi.
Exemple 1
Entrée
a[] = { -1, 1, -2, -2, 3 }
Sortie
-12
Explication : ( -1 × 1 × -2 × -2 × 3 ).
Exemple 2
Entrée
a[] = { -1, 0 }
Sortie
-1
Explication : { -1 }.
1. S'il y a un nombre pair de nombres négatifs et pas de zéros :
   Le résultat est le produit de tous sauf le plus grand nombre négatif (le plus proche de zéro).

2. S'il y a un nombre impair de nombres négatifs et pas de zéros :
   Le résultat est simplement le produit de tous.

3. S'il y a des zéros et des positifs, pas de négatifs :
   Le résultat est 0.

4. Cas exceptionnel : quand il n'y a pas de nombre négatif et tous les autres éléments positifs :
   Le résultat doit être le premier nombre minimum positif.
#include <stdio.h>
#include <limits.h>

int minProduit(int a[], int n) {
    if (n == 1)
        return a[0];
    
    int max_neg = INT_MIN;    // Plus grand négatif (le plus proche de zéro)
    int min_pos = INT_MAX;    // Plus petit positif
    int cpt_neg = 0;          // Compteur de négatifs
    int cpt_zero = 0;         // Compteur de zéros
    int prod = 1;             // Produit des éléments non nuls
    
    for (int i = 0; i < n; i++) {
        // Ignorer si zéro
        if (a[i] == 0) {
            cpt_zero++;
            continue;
        }
        
        // Compter et trouver le plus grand négatif
        if (a[i] < 0) {
            cpt_neg++;
            if (a[i] > max_neg)
                max_neg = a[i];
        }
        
        // Stocker le nombre positif minimum
        if (a[i] > 0) {
            if (a[i] < min_pos)
                min_pos = a[i];
        }
        
        prod *= a[i];
    }
    
    // Cas 1 : tous zéros ou que des zéros et positifs
    if (cpt_zero == n || (cpt_neg == 0 && cpt_zero > 0))
        return 0;
    
    // Cas 2 : tous positifs
    if (cpt_neg == 0)
        return min_pos;
    
    // Cas 3 : nombre pair de négatifs
    if (cpt_neg % 2 == 0 && cpt_neg != 0) {
        // Exclure le plus grand négatif (le plus proche de zéro)
        prod /= max_neg;
    }
    
    return prod;
}

int main() {
    int a[] = {-1, 1, -2, -2, 3};
    int n = sizeof(a) / sizeof(a[0]);
    
    printf("Tableau : ");
    for (int i = 0; i < n; i++)
        printf("%d ", a[i]);
    printf("\n");
    
    int resultat = minProduit(a, n);
    printf("Produit minimum : %d\n", resultat);
    
    // Deuxième exemple
    int b[] = {-1, 0};
    int m = sizeof(b) / sizeof(b[0]);
    
    printf("\nTableau : ");
    for (int i = 0; i < m; i++)
        printf("%d ", b[i]);
    printf("\n");
    
    resultat = minProduit(b, m);
    printf("Produit minimum : %d\n", resultat);
    
    return 0;
}
import math

def minProduit(a, n):
    if n == 1:
        return a[0]
    
    max_neg = -math.inf      # Plus grand négatif (le plus proche de zéro)
    min_pos = math.inf       # Plus petit positif
    cpt_neg = 0              # Compteur de négatifs
    cpt_zero = 0             # Compteur de zéros
    prod = 1                 # Produit des éléments non nuls
    
    for i in range(n):
        # Ignorer si zéro
        if a[i] == 0:
            cpt_zero += 1
            continue
        
        # Compter et trouver le plus grand négatif
        if a[i] < 0:
            cpt_neg += 1
            max_neg = max(max_neg, a[i])
        
        # Stocker le nombre positif minimum
        if a[i] > 0:
            min_pos = min(min_pos, a[i])
        
        prod *= a[i]
    
    # Cas 1 : tous zéros ou que des zéros et positifs
    if cpt_zero == n or (cpt_neg == 0 and cpt_zero > 0):
        return 0
    
    # Cas 2 : tous positifs
    if cpt_neg == 0:
        return min_pos
    
    # Cas 3 : nombre pair de négatifs
    if cpt_neg % 2 == 0 and cpt_neg != 0:
        # Exclure le plus grand négatif (le plus proche de zéro)
        prod = int(prod / max_neg)
    
    return prod

# Tester la fonction
a = [-1, 1, -2, -2, 3]
n = len(a)
print(f"Tableau : {a}")
print(f"Produit minimum : {minProduit(a, n)}")

# Deuxième exemple
b = [-1, 0]
print(f"\nTableau : {b}")
print(f"Produit minimum : {minProduit(b, len(b))}")
Sortie
Tableau : [-1, 1, -2, -2, 3]
Produit minimum : -12

Tableau : [-1, 0]
Produit minimum : -1
Sortie
// La sortie apparaîtra ici…
Prêt · Ctrl+Entrée pour exécuter

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.