0523 - SecvEgale: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/523/secvegale 0523 - SecvEgale] ---- == Cerinţa == Se dă un vector cu n elemente, numere naturale. Determinați cea mai lungă secvență de elemente egale din vector. Dacă în vector există mai multe secvențe de elemente egale de lungime maximă se va determina cea mai din dreapta. == Date de intrare == Programul citește de la tastatură numărul n, iar apoi n numere naturale, reprezentând elementele vectorului. == Date de ieșir...
 
Flaviu (talk | contribs)
No edit summary
Line 23: Line 23:
# 0523 - SecvEgale
# 0523 - SecvEgale


n = int(input("Introduceți numărul de elemente din vector: "))
def citire_date():
v = list(map(int, input("Introduceți elementele vectorului: ").split()))
    n = int(input())
    v = []
    for i in range(n):
        v.append(int(input()))
    return v


# Initializăm variabilele pentru secvența maximă
max_len = 1
max_start = 0
max_end = 0


# Parcurgem vectorul incepand de la elementul 1
def rezolvare(v):
i = 1
    st, dr = 0, 0
while i < n:
    max_lungime = 0
     # Daca elementul curent este egal cu cel anterior
     i = 0
     if v[i] == v[i-1]:
     while i < len(v):
        # Determinăm lungimea secvenței curente
        len_seq = 2
         j = i + 1
         j = i + 1
         while j < n and v[j] == v[j-1]:
         while j < len(v) and v[j] == v[i]:
            len_seq += 1
             j += 1
             j += 1
         # Verificăm dacă secvența curentă este mai lungă decât cea maximă
         lungime = j - i
        if len_seq > max_len:
         if lungime >= max_lungime:
            max_len = len_seq
             max_lungime = lungime
            max_start = i - 1
             st, dr = i, j - 1
            max_end = j - 1
         # Daca există mai multe secvențe de aceeași lungime maximă
        # Alegem secvența mai din dreapta
        elif len_seq == max_len and j - 1 > max_end:
             max_start = i - 1
             max_end = j - 1
         i = j
         i = j
    return st, dr
def validare(v):
    return len(v) > 0 and all(isinstance(x, int) for x in v)
if __name__ == "__main__":
    v = citire_date()
    if validare(v):
        st, dr = rezolvare(v)
        print(st + 1, dr + 1)
     else:
     else:
         i += 1
         print("Date de intrare invalide.")


# Afisăm capetele secvenței maximale
print(max_start, max_end)


</syntaxhighlight>
</syntaxhighlight>
== Explicație rezolvare==
Funcția citire_date() citește de la tastatură numărul n, apoi n numere întregi, reprezentând elementele vectorului v. Acestea sunt stocate în lista v, care este întoarsă la sfârșitul funcției.
Funcția rezolvare(v) primește ca parametru lista v și determină cea mai lungă secvență de elemente egale din vector, returnând indicii de la început și sfârșit ai acestei secvențe. Algoritmul utilizat este unul clasic de parcurgere a vectorului și ținere a unor variabile auxiliare pentru stocarea lungimii maxime a secvenței, precum și indicii corespunzători.
Funcția validare(v) primește ca parametru lista v și verifică dacă aceasta este nevidă și conține doar numere întregi. Verificarea se face cu ajutorul funcției încorporate all() și a expresiei isinstance(x, int).
În blocul if __name__ == "__main__", se citesc datele de intrare cu ajutorul funcției citire_date(), se validează cu funcția validare(v) și se calculează rezultatul cu ajutorul funcției rezolvare(v). Dacă datele de intrare sunt valide, se afișează rezultatul pe ecran, iar dacă nu, se afișează un mesaj corespunzător.

Revision as of 19:45, 17 April 2023

Sursa: 0523 - SecvEgale


Cerinţa

Se dă un vector cu n elemente, numere naturale. Determinați cea mai lungă secvență de elemente egale din vector. Dacă în vector există mai multe secvențe de elemente egale de lungime maximă se va determina cea mai din dreapta.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n numere naturale, reprezentând elementele vectorului.

Date de ieșire

Programul va afișa pe ecran indicii st dr ai capetelor secvenței determinate, separați printr-un spațiu.

Restricţii şi precizări

  • 1 ≤ n ≤ 1000
  • cele n numere citite vor fi mai mici decât 1000
  • indicii elementelor vectorului sunt cuprinși între 1 și n

Exemplu

Intrare
10
5 5 1 1 1 1 2 2 2 2
Ieșire
7 10

Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 0523 - SecvEgale

def citire_date():

   n = int(input())
   v = []
   for i in range(n):
       v.append(int(input()))
   return v


def rezolvare(v):

   st, dr = 0, 0
   max_lungime = 0
   i = 0
   while i < len(v):
       j = i + 1
       while j < len(v) and v[j] == v[i]:
           j += 1
       lungime = j - i
       if lungime >= max_lungime:
           max_lungime = lungime
           st, dr = i, j - 1
       i = j
   return st, dr


def validare(v):

   return len(v) > 0 and all(isinstance(x, int) for x in v)


if __name__ == "__main__":

   v = citire_date()
   if validare(v):
       st, dr = rezolvare(v)
       print(st + 1, dr + 1)
   else:
       print("Date de intrare invalide.")


</syntaxhighlight>

Explicație rezolvare

Funcția citire_date() citește de la tastatură numărul n, apoi n numere întregi, reprezentând elementele vectorului v. Acestea sunt stocate în lista v, care este întoarsă la sfârșitul funcției. Funcția rezolvare(v) primește ca parametru lista v și determină cea mai lungă secvență de elemente egale din vector, returnând indicii de la început și sfârșit ai acestei secvențe. Algoritmul utilizat este unul clasic de parcurgere a vectorului și ținere a unor variabile auxiliare pentru stocarea lungimii maxime a secvenței, precum și indicii corespunzători. Funcția validare(v) primește ca parametru lista v și verifică dacă aceasta este nevidă și conține doar numere întregi. Verificarea se face cu ajutorul funcției încorporate all() și a expresiei isinstance(x, int). În blocul if __name__ == "__main__", se citesc datele de intrare cu ajutorul funcției citire_date(), se validează cu funcția validare(v) și se calculează rezultatul cu ajutorul funcției rezolvare(v). Dacă datele de intrare sunt valide, se afișează rezultatul pe ecran, iar dacă nu, se afișează un mesaj corespunzător.