2533 - SecventaIncadrata

From Bitnami MediaWiki
Revision as of 14:57, 30 April 2023 by Csula Beatrice (talk | contribs) (→‎Explicaţie cod)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursa: - SecventaIncadrata


Cerinţa[edit | edit source]

Numim secvență încadrată a unui șir de numere naturale un subșir al acestuia, format din termeni aflați pe poziții consecutive în șirul dat, subșir care începe și se termină cu aceeași valoare. Lungimea secvenței este egală cu numărul de termeni ai acesteia.

Să se determine secvențele încadrate dintr-un șir, care au lungimea maximă.

Date de intrare[edit | edit source]

Fișierul de intrare secventaincadrata.in conține cel puțin două și cel mult 106 numere naturale din intervalul [0,9], separate printr-un spațiu.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi in fișierul de ieșire secventaincadrata.out va conține pe prima linie numărul L, reprezentând lungimea maximă a secvențelor încadrate, iar pe a doua linie a fișierului valoarea primului termen al fiecărei secvențe încadrate de lungime maximă, în ordine crescătoare și separate printr-un spațiu. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricţii şi precizări[edit | edit source]

  • în șir există ce puțin doi termeni egali
  • proiectați un algoritm eficient din punctul de vedere al timpului de executare și a memoriei utilizate
  • se recomandă o soluție care să evite stocarea tuturor valorilor citite într-un tablou sau într-o altă structură de date similară

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

secventaincadrata.in
3 1 5 2 4 5 5 2 5 9 5 7 4 6 8 0 8
Ieșire
Datele sunt corecte.
secventaincadrata.out
9
4 5

Exemplul 2[edit | edit source]

secventaincadrata.in
9 0 1 3 4 7 1 8 9 1 3 1 2 3 4 6
Ieșire
Datele sunt corecte.
secventaincadrata.out
11
3 4

Exemplul 3[edit | edit source]

secventaincadrata.in
314441 41241241
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 2533 secventaincadrata

def secventaincadrata(vector):

    with open("secventaincadrata.out","w") as f:
       A = [float('inf')] * 10
       lmax = [0] * 10
       L = 0
       i = 1
       for x in vector:
           lmax[x] = max(i - A[x] + 1, lmax[x])
           if A[x] == float('inf'):
               A[x] = i
           L = max(lmax[x], L)
           i += 1
       f.write(str(L) + '\n')
       for i in range(10):
           if lmax[i] == L:
               f.write(str(i) + ' ')
       f.write('\n')
   

def conform_restrictiilor():

   with open('secventaincadrata.in') as f:
       vector = list(map(int, f.read().split()))
   if len(vector) < 2 or len(vector) > 106:
       print("Datele nu sunt conform restricțiilor impuse.")
       exit()
   for x in vector:
       if x > 9:
           print("Datele nu sunt conform restricțiilor impuse.")
           exit()
   print("Datele sunt corecte.")
   return vector 


if __name__ == '__main__':

   vector= conform_restrictiilor()
   secventaincadrata(vector)

</syntaxhighlight>

Explicaţie cod[edit | edit source]

cest cod implementează o funcție secventaincadrata care primește un vector de numere întregi și calculează lungimea celei mai lungi subsecvențe a vectorului care conține cel puțin două elemente și în care toate elementele sunt identice sau difera cel mult cu o unitate.

De asemenea, programul verifică dacă datele de intrare sunt valide (două sau mai multe elemente, fiecare element să fie un număr întreg între 0 și 9), iar apoi apelează funcția secventaincadrata cu vectorul de intrare dat.

Funcția secventaincadrata folosește o listă A și o listă lmax. Listele au dimensiunea 10 și reprezintă valori auxiliare folosite în calcularea lungimii subsecvenței cerute.

Pe parcursul parcurgerii vectorului, pentru fiecare element, se calculează lungimea maximă a subsecvenței în care toate elementele sunt identice sau difera cel mult cu o unitate și care se termină cu elementul curent. Aceasta se face folosind formula max(i - A[x] + 1, lmax[x]), unde i este indicele curent al elementului, x este valoarea elementului și A[x] este poziția celui mai recent element cu valoarea x. De asemenea, se actualizează lista A, astfel încât A[x] să conțină poziția curentă i.

La final, programul scrie în fișierul secventaincadrata.out lungimea celei mai lungi subsecvențe găsite și afișează subsecvențele cu această lungime.