salut je suis maintenant bloqué sur exercice depuis 2 3 jours j'arrive a résoudre le problème mais je ne valide pas tous les test car mon programme est trop lent je n'arrive a trouver une solution pour le rendre plus rapide je viens donc demander conseil
Voici l'énoncé du problème :
Énoncé
Dans une liste de nombres entiers, une répétition est une paire de nombres égaux qui sont côte à côte. Par exemple, dans la liste 1 3 3 4 2 2 1 1 1, il y a quatre répétitions : les deux 3, puis les deux 2, puis les deux 1 qui suivent, et enfin les deux 1 de la fin de la liste.
On vous donne une liste de nombres entiers. Écrivez un programme qui calcule le nombre minimum de répétitions qu'il peut rester dans la liste une fois que l'on a retiré toutes les occurrences d'un des nombres.
Entrée
La première ligne de l'entrée contient un entier nbNombres, avec 2 ≤ nbNombres ≤ 50 000.
Les nbNombres lignes suivantes contiennent chacune un entier compris entre 0 et nbNombres.
Sortie
Vous devez afficher un nombre : le nombre minimum de répétitions qu'il est possible d'obtenir après avoir supprimé toutes les occurrences d'un des nombres de la liste.
Exemples
Voici un exemple d'entrée :
9
1
3
2
2
3
4
4
2
1
La liste de 9 nombres est "1 3 2 2 3 4 4 2 1". Elle contient deux répétitions (les deux premiers 2 et les deux 4) :
retirer les 1 laisse les deux répétitions ;
retirer les 2 rapproche les trois, donc on a supprimé une répétition et en rajoute une. Il reste donc deux répétitions ;
retirer les 3 laisse les deux répétitions ;
retirer les 4 ne laisse qu'une répétition.
Si on supprime toutes les occurrences du nombre 4, il reste une seule répétition. Il n'est pas possible d'en obtenir moins, donc votre programme doit afficher :
1
Limites
Limite de temps : 1000 ms.
Limite de mémoire : 64000 kb.
La limite de temps est réglée de telle sorte qu'une solution qui parcourt un petit nombre de fois toute la liste puisse avoir tous les points, mais qu'une solution qui pour chaque nombre de la liste, boucle sur tous les autres nombres de la liste ne puisse résoudre qu'environ la moitié des tests sans dépasser la limite de temps.
et voici mon code :
Avec ce code je valide 12/16 test et les 4 test m'affiche temps d'exécution dépassé comment je pourrait améliorait mon Code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 nb = int(input()) lst = [] dico = {} for i in range(nb): lst.append(int(input())) for val in lst: dico[val] = 0 for i in range(1, nb): nombre = lst[i] if nombre == lst[i-1]: for key in dico: if key != nombre: dico[key] += 1 else : det = 2 nombretre = lst[i-1] Trouve = False while Trouve == False and det <= i : if nombre == lst[i-det] : dico[nombretre] += 1 Trouve = True if lst[i-det] != nombretre: Trouve = True det += 1 print(min(dico.values()))
Partager