0578 - SecvEgale2: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
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 68: Line 73:
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==


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.
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.
Î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.
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.
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.
main(): Aceasta este funcția principală a programului. Citim numărul n și vectorul arr folosind input de la utilizator. Apoi, apelăm funcția find_longest_equal_seq și afișăm rezultatul.

Revision as of 20:08, 14 May 2023

Sursa: 0578 - SecvEgale2


Cerinţa

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

Date de intrare

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

Date de ieșire

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

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

Exemplu 1

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

Exemplu 2

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


Rezolvare

Rezolvare ver. 1

<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

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.

main(): Aceasta este funcția principală a programului. Citim numărul n și vectorul arr folosind input de la utilizator. Apoi, apelăm funcția find_longest_equal_seq și afișăm rezultatul.