0578 - SecvEgale2: Diferență între versiuni

De la Universitas MediaWiki
Fără descriere a modificării
Fără descriere a modificării
Linia 27: Linia 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 ==  
Linia 35: Linia 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
Linia 68: Linia 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.

Versiunea de la data 14 mai 2023 20:08

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

# 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)

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.