0959 - secmax: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
 
(2 intermediate revisions by one other user not shown)
Line 11: Line 11:


== Date de ieșire ==  
== Date de ieșire ==  
Fișierul de ieșire secmax.out va conține:
 
Dacă datele sunt introduse corect, pe ecran se va afișa:  
Dacă datele sunt introduse corect, pe ecran se va afișa:  
'''"Datele sunt introduse corect."''', apoi pe un rând nou '''numărul c''', reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: '''"Datele nu corespund restricțiilor impuse."'''.
'''"Datele sunt introduse corect."''' secmax.out va conține pe prima linie un număr natural, reprezentând numărul total de secvenţe-maxim din numărul X''', reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: '''"Datele nu corespund restricțiilor impuse."'''.


== Restricţii şi precizări ==
== Restricţii şi precizări ==
Line 20: Line 20:
* X1 ≠ 0
* X1 ≠ 0
* o secvență-maxim este formată din cel puțin trei cifre
* o secvență-maxim este formată din cel puțin trei cifre
== Exemplu ==
== Exemplu 1 ==
; Intrare
; Intrare
: secmax.in
: 8
: 8
: 12543644
: 12543644
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: Datele sunt introduse correct.
: Datele sunt introduse correct.
: secmax.out
: 5
: 5
== Exemplu 2 ==
; Intrare
: secmax.in
: -9
: 0 2 123458
; Ieșire
: Datele nu corespund restricțiilor impuse.


== Rezolvare ==  
== Rezolvare ==  
Line 34: Line 44:
# 0959 - secmax
# 0959 - secmax


def citire():
def calculate_total_sequences(n, digits):
     with open("secmax.in", "r") as f:
     if n < 3:
         n = int(f.readline())
         return 0
        x = list(map(int, f.readline().split()))
    return n, x


def secventa_maxim(x):
     count = 0
    n = len(x)
     for i in range(n - 2):
     cnt = 0
         if digits[i] < digits[i + 1] > digits[i + 2]:
     i = 0
             count += 1
    while i < n-1:
 
         j = i+1
    return count
        while j < n and x[j] < x[j-1]:
 
             j += 1
 
        k = j
def validate_input(n, digits):
        while k < n and x[k] > x[k-1]:
    if n < 8 or n > 25000:
            k += 1
        return False
        cnt += (k-j)
 
         i = k-1
    if any(digit < 0 or digit > 9 for digit in digits):
     return cnt
         return False
 
    if digits[0] == 0:
        return False
 
     return True


def validare(cnt):
    assert cnt >= 0, "Numarul de secvente maxim nu poate fi negativ!"


if __name__ == "__main__":
if __name__ == "__main__":
    n, x = citire()
     with open("secmax.in", "r") as file:
    cnt = secventa_maxim(x)
         n = int(file.readline())
     with open("secmax.out", "w") as f:
        digits = list(map(int, file.readline().split()))
         f.write(str(cnt))
 
     try:
     if validate_input(n, digits):
        validare(cnt)
         print("Datele sunt introduse corect.")
         print("Datele sunt introduse corect.")
     except AssertionError as e:
        result = calculate_total_sequences(n, digits)
        with open("secmax.out", "w") as file:
            file.write(str(result))
     else:
         print("Datele nu corespund restricțiilor impuse.")
         print("Datele nu corespund restricțiilor impuse.")
        print(e)




</syntaxhighlight>
</syntaxhighlight>
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==
Funcția citire citește datele de intrare din fișierul "secmax.in" și le returnează sub formă de tuplu (n, x), unde n este lungimea numărului x și x este o listă de n cifre reprezentând numărul dat.
Sunt definite două funcții:


Funcția secventa_maxim calculează numărul total de secvențe-maxim din numărul dat x, folosind o metodă iterativă de explorare a secvențelor. Se pleacă de la prima cifră și se caută o secvență descrescătoare continuă, apoi o secvență crescătoare continuă. Aceste două secvențe formează o secvență-maxim. Se adaugă numărul de elemente din secvența crescătoare la un contor cnt și se continuă explorarea de la finalul secvenței crescătoare. Se repetă până la parcurgerea întregului număr.
calculate_total_sequences(n, digits): Aceasta primește numărul n de cifre și lista digits care conține cifrele numărului X. Verifică dacă numărul de cifre este mai mic de 3 și, în caz afirmativ, returnează 0. În caz contrar, parcurge lista de cifre și numără secvențele-maxim.


Funcția validare verifică dacă numărul de secvențe-maxim calculat este un număr pozitiv sau zero.
validate_input(n, digits): Aceasta validează datele de intrare. Verifică dacă numărul n se încadrează în intervalul specificat și dacă prima cifră din lista digits este diferită de 0.


În blocul if __name__ == "__main__": se apelează funcțiile citire, secventa_maxim și validare, se scrie rezultatul în fișierul "secmax.out" și se afișează un mesaj de confirmare a terminării programului.
În blocul if __name__ == "__main__": se citesc datele de intrare din fișierul "secmax.in". Se validează datele folosind funcția validate_input. Dacă datele sunt corecte, se calculează numărul total de secvențe-maxim utilizând funcția calculate_total_sequences. Rezultatul este scris în fișierul "secmax.out". În caz contrar, se afișează un mesaj corespunzător.

Latest revision as of 22:37, 14 May 2023

Sursa: 0959 - secmax


Cerinţa[edit]

Scrieți un program care citește numărul N, cele N cifre ale numărului X și care determină numărul total de secvenţe-maxim din numărul X.


Date de intrare[edit]

Fișierul de intrare secmax.in conține pe prima linie numărul natural N. Pe următoarea linie se află o succesiune de N cifre X1X2...XN, reprezentând cifrele numărului X.


Date de ieșire[edit]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect." secmax.out va conține pe prima linie un număr natural, reprezentând numărul total de secvenţe-maxim din numărul X, 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]

  • 8 ≤ N ≤ 25000
  • 0 ≤ X1, X2 , ..., XN ≤ 9
  • X1 ≠ 0
  • o secvență-maxim este formată din cel puțin trei cifre

Exemplu 1[edit]

Intrare
secmax.in
8
12543644
Ieșire
Datele sunt introduse correct.
secmax.out
5

Exemplu 2[edit]

Intrare
secmax.in
-9
0 2 123458
Ieșire
Datele nu corespund restricțiilor impuse.


Rezolvare[edit]

Rezolvare ver. 1[edit]

<syntaxhighlight lang="python" line>

  1. 0959 - secmax

def calculate_total_sequences(n, digits):

   if n < 3:
       return 0
   count = 0
   for i in range(n - 2):
       if digits[i] < digits[i + 1] > digits[i + 2]:
           count += 1
   return count


def validate_input(n, digits):

   if n < 8 or n > 25000:
       return False
   if any(digit < 0 or digit > 9 for digit in digits):
       return False
   if digits[0] == 0:
       return False
   return True


if __name__ == "__main__":

   with open("secmax.in", "r") as file:
       n = int(file.readline())
       digits = list(map(int, file.readline().split()))
   if validate_input(n, digits):
       print("Datele sunt introduse corect.")
       result = calculate_total_sequences(n, digits)
       with open("secmax.out", "w") as file:
           file.write(str(result))
   else:
       print("Datele nu corespund restricțiilor impuse.")


</syntaxhighlight>

Explicatie Rezolvare[edit]

Sunt definite două funcții:

calculate_total_sequences(n, digits): Aceasta primește numărul n de cifre și lista digits care conține cifrele numărului X. Verifică dacă numărul de cifre este mai mic de 3 și, în caz afirmativ, returnează 0. În caz contrar, parcurge lista de cifre și numără secvențele-maxim.

validate_input(n, digits): Aceasta validează datele de intrare. Verifică dacă numărul n se încadrează în intervalul specificat și dacă prima cifră din lista digits este diferită de 0.

În blocul if __name__ == "__main__": se citesc datele de intrare din fișierul "secmax.in". Se validează datele folosind funcția validate_input. Dacă datele sunt corecte, se calculează numărul total de secvențe-maxim utilizând funcția calculate_total_sequences. Rezultatul este scris în fișierul "secmax.out". În caz contrar, se afișează un mesaj corespunzător.