1439 - Sir6

From Bitnami MediaWiki

Se dă un şir de N numere naturale. Din acest şir, putem forma un şir comprimat de forma: a[1], b[1], a[2], b[2], …, a[x], b[x], din care înţelegem că numărul a[1] apare pe primele b[1] poziţii, a[2] apare pe următoarele b[2] poziţii…, iar a[x] apare pe ultimele b[x] poziţii. De exemplu, dacă şirul dat este 1 1 5 5 5 2, atunci şirul comprimat va fi 1 2 5 3 2 1.

Cerința[edit | edit source]

Să se determine: a) Lungimea celei mai lungi secvenţe formată din numere egale. b) Şirul comprimat pentru şirul dat.

Date de intrare[edit | edit source]

Fișierul de intrare sir6in.txt conține pe prima linie numerele P şi N. Pe următoarea linie se găseşte un şir format din N numere naturale.

Date de ieșire[edit | edit source]

Fișierul de ieșire sir6out.txt va conține pe prima linie: a) Dacă P este 1, lungimea celei mai lungi secvenţe, reprezentând răspunsul la cerinţa a). b) Dacă P este 2, şirul comprimat, reprezentând răspunsul la cerinţa b). caz contrar, se va afișa mesajul:" Datele de intrare nu corespund restrictiilor impuse"

Restricții și precizări[edit | edit source]

  • N <= 100.000
  • Numerele din şir nu depăşesc 1.000.000.
  • P este 1 sau 2.

Exemplul 1[edit | edit source]

sir6in.txt
1 6
1 1 5 5 5 2
sir6out.txt
Datele introduse corespund restricțiilor impuse.
3

Explicație[edit | edit source]

Pentru acest test P = 1, deci se va rezolva doar cerinţa a). Secvenţa cea mai lungă formată din numere egale este: 5 5 5 şi are lungimea 3.

Exemplul 2[edit | edit source]

sir6in.txt
2 6
1 1 5 5 5 2
sir6out.txt
Datele introduse corespund restricțiilor impuse.
1 2 5 3 2 1

Explicație[edit | edit source]

Pentru acest test P = 2, deci se va rezolva doar cerinţa b). Numărul 1 apare de 2 ori, numărul 5 apare de 3 ori, iar numărul 2 apare o singură dată. Prin urmare, şirul comprimat este 1 2 5 3 2 1.

Exemplul 3[edit | edit source]

sir6in.txt
2
1 2 3 4 5 1000000001
2
1 3
2 4
sir6out.txt
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 1439 - Sir6

from itertools import groupby


def validare(p, numarde_elemente, sirul): # functia de validare a datelor de intrare

   if p not in [1, 2] or not (1 <= numarde_elemente <= 100000):
       raise ValueError
   if any(not (0 <= element <= 1000000) for element in sirul):
       raise ValueError
   fisier_iesire.write("Datele de intrare corespund restrictiilor impuse\n")


def proceseaza_sir(p, sirul): # functia de rezolvare

   if p == 1:
       lungime_maxima = max(len(list(grup)) for _, grup in groupby(sirul))
       fisier_iesire.write(f"{lungime_maxima}\n")
   elif p == 2:
       sir_comprimat = [f"{k} {len(list(grup))}" for k, grup in groupby(sirul)]
       fisier_iesire.write(" ".join(sir_comprimat) + "\n")


if __name__ == '__main__':

   fisier_intrare = open("sir6in.txt", "r")         # declararea fisierelor
   fisier_iesire = open("sir6out.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)
   try:
       P, numar_elemente = map(int, fisier_intrare.readline().split())
       sir = list(map(int, fisier_intrare.readline().split()))
       validare(P, numar_elemente, sir)                 # apelul functiei de validare
       proceseaza_sir(P, sir)               # apelul functiei de rezolvare
   except ValueError:
       fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>