0578 - SecvEgale2: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
 
(3 intermediate revisions by the same user not shown)
Line 27: Line 27:
: 4 3 3 3 5
: 4 3 3 3 5
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: Datele nu corespund restrictiilor inpuse.
: 3
 


== Rezolvare ==  
== Rezolvare ==  
Line 35: Line 35:
# 0578 - SecvEgale2
# 0578 - SecvEgale2


def longest_equal_seq(n, arr):
def validate_input(n, arr):
     if not 1 <= n <= 100000:
     if not 1 <= n <= 100000:
        print("Datele nu corespund restricțiilor impuse.")
         return False
         return
     if not all(0 <= x < 1000000000 for x in arr):
     if not all(0 <= x < 1000000000 for x in arr):
        return False
    return True
def longest_equal_seq(n, arr):
    if not validate_input(n, arr):
         print("Datele nu corespund restricțiilor impuse.")
         print("Datele nu corespund restricțiilor impuse.")
         return
         return
Line 67: Line 72:


== Explicatie Rezolvare ==
== Explicatie Rezolvare ==
arr -> vine de la lista
validate_input(n: int, arr: list[int]) -> bool: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifică dacă numărul n respectă restricțiile impuse de problema (adica 1 ≤ n ≤ 100.000) și dacă toate elementele din vectorul arr sunt mai mici decât 1.000.000.000. Dacă restricțiile sunt respectate, funcția returnează True, altfel returnează False.
find_longest_equal_seq(n: int, arr: list[int]) -> None: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifica dacă datele sunt introduse corect folosind funcția validate_input și, în caz afirmativ, găsește lungimea celei mai lungi secvențe a vectorului arr care conține elemente egale și afișează indicii capetelor acestei secvențe.


Funcția find_equal_sequences primește numărul de elemente n și vectorul v și determină câte secvențe ale vectorului au toate elementele egale.
In if __name__ == "__main__"itim numărul n și vectorul arr folosind input de la utilizator. Apoi, apelăm funcția find_longest_equal_seq și afișăm rezultatul.
Înainte de a face calculul, se verifică restricțiile impuse.
Se construiește un dicționar freq în care cheile sunt elementele distincte din vector, iar valorile sunt frecvențele lor.
Frecvența maximă se determină cu funcția max, iar numărul de elemente cu această frecvență se determină cu o buclă for și o expresie generator sum(1 for f in freq.values() if f == max_freq).
În funcția if __name__ == "__main__":, se citește mai întâi numărul de elemente n, iar apoi vectorul de numere arr, pe care le pasăm funcției longest_equal_seq pentru a efectua prelucrarea datelor și afișarea rezultatului.

Latest revision as of 20:31, 14 May 2023

Sursa: 0578 - SecvEgale2


Cerinţa[edit | edit source]

Se dă un vector cu n elemente, numere naturale. Determinați câte secvențe ale vectorului au toate elementele egale.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n, apoi cele n elemente ale vectorului.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou va afișa pe ecran indicii st dr ai capetelor secvenței determinate, separați printr-un spațiu, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

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

  • 1 ≤ n ≤ 100.000
  • elementele vectorului vor fi mai mici decât 1.000.000.000

Exemplu 1[edit | edit source]

Intrare
5
4 3 3 3 5
Ieșire
Datele sunt introduse corect.
8

Exemplu 2[edit | edit source]

Intrare
5
4 3 3 3 5
Ieșire
Datele nu corespund restrictiilor inpuse.


Rezolvare[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 0578 - SecvEgale2

def validate_input(n, arr):

   if not 1 <= n <= 100000:
       return False
   if not all(0 <= x < 1000000000 for x in arr):
       return False
   return True


def longest_equal_seq(n, arr):

   if not validate_input(n, arr):
       print("Datele nu corespund restricțiilor impuse.")
       return
   count = 1
   max_count = 1
   for i in range(1, n):
       if arr[i] == arr[i - 1]:
           count += 1
       else:
           max_count = max(max_count, count)
           count = 1
   max_count = max(max_count, count)
   print("Datele sunt introduse corect.")
   print(max_count)


if __name__ == "__main__":

   n = int(input().strip())
   arr = list(map(int, input().strip().split()))
   longest_equal_seq(n, arr)


</syntaxhighlight>

Explicatie Rezolvare[edit | edit source]

arr -> vine de la lista

validate_input(n: int, arr: list[int]) -> bool: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifică dacă numărul n respectă restricțiile impuse de problema (adica 1 ≤ n ≤ 100.000) și dacă toate elementele din vectorul arr sunt mai mici decât 1.000.000.000. Dacă restricțiile sunt respectate, funcția returnează True, altfel returnează False.

find_longest_equal_seq(n: int, arr: list[int]) -> None: Această funcție primește doi parametri: numărul n și vectorul arr. Funcția verifica dacă datele sunt introduse corect folosind funcția validate_input și, în caz afirmativ, găsește lungimea celei mai lungi secvențe a vectorului arr care conține elemente egale și afișează indicii capetelor acestei secvențe.

In if __name__ == "__main__"itim numărul n și vectorul arr folosind input de la utilizator. Apoi, apelăm funcția find_longest_equal_seq și afișăm rezultatul.