0578 - SecvEgale2: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
Line 35: Line 35:
# 0578 - SecvEgale2
# 0578 - SecvEgale2


def read_input():
def longest_equal_seq(n, arr):
     n = int(input())
     if not 1 <= n <= 100000:
     v = list(map(int, input().split()))
        print("Datele nu corespund restricțiilor impuse.")
     return v
        return
     if not all(0 <= x < 1000000000 for x in arr):
        print("Datele nu corespund restricțiilor impuse.")
        return
 
    count = 1
     max_count = 1


def count_equal_sequences(v):
     for i in range(1, n):
    cnt = 0
         if arr[i] == arr[i - 1]:
    last = None
             count += 1
    seq_len = 0
   
     for i in range(len(v)):
         if v[i] != last:
             if seq_len >= 2:
                cnt += 1
            seq_len = 1
            last = v[i]
         else:
         else:
             seq_len += 1
             max_count = max(max_count, count)
              
             count = 1
    if seq_len >= 2:
        cnt += 1
       
    return cnt


def validate_output(expected, actual):
    max_count = max(max_count, count)
     return expected == actual
    print("Datele sunt introduse corect.")
     print(max_count)


if __name__ == '__main__':
    v = read_input()
    result = count_equal_sequences(v)
    expected = int(input())
    if validate_output(expected, result):
        print("Datele sunt introduse corect.")
    else:
        print("Datele nu corespund restricțiilor impuse.")
    if validate_output(expected, result):
        print("Raspunsul este: ", result)


if __name__ == "__main__":
    n = int(input().strip())
    arr = list(map(int, input().strip().split()))
    longest_equal_seq(n, arr)




Line 79: Line 68:
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==


read_input(): Aceasta functie citeste de la tastatura numarul de elemente al listei si apoi elementele listei, separate prin spatii. Aceasta returneaza lista citita.
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.
 
Înainte de a face calculul, se verifică restricțiile impuse.
count_equal_sequences(v): Aceasta functie primeste o lista v ca si argument si calculeaza numarul de secvente consecutive formate din cel putin doua elemente egale. Pentru asta, parcurgem lista si incrementam un contor atunci cand gasim o secventa valida.
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).
validate_output(expected, actual): Aceasta functie primeste doua argumente: valoarea asteptata (expected) si valoarea reala (actual) a rezultatului. Aceasta verifica daca cele doua valori sunt egale si returneaza True daca da si False altfel.
Î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.
 
In ceea ce priveste blocul if __name__ == '__main__':, acesta verifica daca programul este executat ca si script (adica nu este importat ca modul) si, in caz afirmativ, citeste datele de intrare, apeleaza functia count_equal_sequences() cu aceste date, citeste rezultatul asteptat de la tastatura, si verifica daca rezultatul real si cel asteptat sunt egale cu ajutorul functiei validate_output(). In functie de rezultatul acestei verificari, este afisat un mesaj corespunzator.

Revision as of 21:24, 13 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 restricțiilor impuse.
3

Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 0578 - SecvEgale2

def longest_equal_seq(n, arr):

   if not 1 <= n <= 100000:
       print("Datele nu corespund restricțiilor impuse.")
       return
   if not all(0 <= x < 1000000000 for x in 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

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. Î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.