0687 - liste
Enunt
Numim listă un sir de numere naturale. Avem la dispoziţie mai multe liste aşezate, în ordine, una sub alta. Spunem că două liste L1 şi L2 sunt vecine dacă L1 este imediat deasupra lui L2, sau dacă L2 este imediat deasupra lui L1. Oricare două liste vecine L1 şi L2 pot fi unificate dacă ele au cel puţin un element comun. Prin unificare, noua listă va avea ca elemente toate elementele din L1 la care se adaugă toate elementele din L2. Listele L1 şi L2 vor dispărea şi în locul lor va apărea noua listă.
Cerința
Determinaţi numărul minim de liste care rezultă după aplicarea unui număr suficient de unificări astfel încât să nu mai existe două liste vecine care să poată fi unificate.
Date de intrare
Fişierul liste.in are pe prima linie un număr natural L reprezentând numărul de liste. Fiecare dintre următoarele L linii descriu, în ordine, câte o listă şi au structura: K A[1] A[2] … A[K]. Primul element notat K reprezintă numărul de elemente din listă. În continuare sunt K numere naturale care reprezintă elementele listei. Numerele de pe aceeaşi linie sunt separate prin câte un spaţiu.
Date de ieșire
Pe prima linie a fişierului liste.out se găseşte un singur număr natural reprezentând valoarea cerută.
Restricții și precizări
- 1 ≤ L ≤ 100.000
- fiecare listă iniţială are cel mult 10 de elemente;
- valorile elementelor listelor sunt numere naturale ≤ 120
Exemplul 1
- intrare
- 4
- 2 0 1
- 1 0
- 3 1 3 3
- 1 2
- iesire
- Datele introduse corespund restrictiilor impuse.
- 2
Exemplul 2
- intrare
- -8
- 12 13 14
- 6 7
- 9 8 7 6
- 0 5
- iesire
- Datele de intrare nu corespund restrictiilor impuse.
Rezolvare
<syntaxhighlight lang="python3" line="1">
- 0687 - liste
def numar_minim_liste(liste):
stiva = []
for lista in liste: unificata = False
while stiva and not unificata: top_lista = stiva.pop()
# Verificăm dacă lista curentă se poate unifica cu lista din vârful stivei if set(lista) & set(top_lista): lista.extend(top_lista) unificata = True else: stiva.append(top_lista)
if not unificata: stiva.append(lista)
return len(stiva)
rezultat = numar_minim_liste(liste_ordonate) print(f"Numărul minim de liste după unificare: {rezultat}")
</syntaxhighlight>