0283 - Secventa: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
 
(One intermediate revision by the same user not shown)
Line 13: Line 13:
Fişierul de ieşire secventa.out va conţine  
Fişierul de ieşire secventa.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."''', apoi pe un rând nou ''' două numere p şi u, separate printr-un spaţiu, reprezentând indicele primului, respectiv al ultimului element din secvenţa determinată''', 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 ==
* 1 ≤ n ≤ 100.000;
* 1 ≤ n ≤ 100.000;
* elementele şirului vor avea cel mult 9 cifre şi sunt numerotate de la 1 la n;
* elementele şirului vor avea cel mult 9 cifre şi sunt numerotate de la 1 la n;
== Exemplu ==
== Exemplu 1 ==
; Intrare
; Intrare
: secventa.in
: 10
: 10
: 2 4 3 6 7 5 2 5 8 10
: 2 4 3 6 7 5 2 5 8 10
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: secventa.out
: Datele sunt introduse correct.
: Datele sunt introduse correct.
: 6 9
: 6 9
== Exemplu 2 ==
; Intrare
: secventa.in
: 10 2 3 4
: 1 9 22 13 5 2 5 8 10
; Ieșire
: Datele nu corespund restricțiilor impuse.


== Rezolvare ==  
== Rezolvare ==  
Line 31: Line 41:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
# 0283 - Secventa
# 0283 - Secventa
def citire():
    try:
        with open("secventa.in", "r") as f:
            n = int(f.readline())
            a = list(map(int, f.readline().split()))
        return n, a
    except:
        print("Datele nu corespund restricțiilor impuse.")
        print("Datele nu sunt introduse corect.")
def rezolvare(n, a):
def rezolvare(n, a):
     p = u = -1
     p = u = -1
Line 70: Line 70:


if __name__ == "__main__":
if __name__ == "__main__":
     n, a = citire()
     try:
    p, u = rezolvare(n, a)
        with open("secventa.in", "r") as f:
    if p != -1 and u != -1:
            n = int(f.readline())
        print("Datele sunt introduse corect.")
            a = list(map(int, f.readline().split()))
     else:
        if n < 1 or n > 100000:
            raise ValueError("Numarul n nu se incadreaza in limitele problemei.")
        for i in range(n):
            if a[i] < 0 or a[i] > 999999999:
                raise ValueError("Elementele sirului trebuie sa fie numere naturale de cel mult 9 cifre.")
        p, u = rezolvare(n, a)
        if p != -1 and u != -1:
            print("Datele sunt introduse corect.")
        else:
            print("Datele nu corespund restricțiilor impuse.")
        validare(p, u)
     except Exception as e:
         print("Datele nu corespund restricțiilor impuse.")
         print("Datele nu corespund restricțiilor impuse.")
    validare(p, u)
        print(e)
 




</syntaxhighlight>
</syntaxhighlight>
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==
Pentru rezolvarea acestei probleme, vom parcurge şirul dat şi vom folosi două variabile: lungimea_secvenţei pentru a memora lungimea secvenţei curente, şi suma_elementelor pentru a memora suma elementelor din secvenţa curentă. De asemenea, vom mai folosi două variabile: max_lungime pentru a memora lungimea maximă găsită până acum, şi max_suma pentru a memora suma maximă găsită până acum, precum şi două variabile: p pentru a memora poziţia de început a secvenţei maxime şi u pentru a memora poziţia de sfârşit a secvenţei maxime.
Funcția de rezolvare, rezolvare(n, a), care primește ca parametri numărul de elemente din șir n și șirul propriu-zis a. Scopul acestei funcții este de a determina cea mai lungă secvență cu proprietatea specificată în enunț și de a returna pozițiile primului și ultimului element din această secvență.
 
Această funcție începe prin a inițializa variabilele p și u cu valoarea -1, semnificând faptul că încă nu am găsit nicio secvență cu proprietatea specificată. De asemenea, funcția mai inițializează două variabile max_lungime și max_suma cu valoarea 0, care vor fi folosite pentru a determina secvența maximă în ceea ce privește lungimea și suma elementelor.
 
În continuare, se parcurge șirul a și se calculează lungimea și suma elementelor din secvența curentă, utilizând variabilele lungime_secventa și suma_elementelor. Dacă se întâlnește un element cu paritatea identică cu elementul anterior, secvența curentă se întrerupe și se inițializează lungimea și suma elementelor pentru o nouă secvență începând cu elementul curent. În caz contrar, se actualizează lungimea și suma elementelor din secvența curentă, și se compară aceste valori cu cele ale secvenței maximale găsite până în acel moment (max_lungime și max_suma). Dacă lungimea secvenței curente depășește lungimea secvenței maxime găsite până în acel moment, sau are lungime egală cu aceasta dar suma elementelor este mai mare, atunci secvența curentă devine noua secvență maximă și se actualizează variabilele max_lungime și max_suma. În plus, se actualizează și variabilele p și u cu pozițiile primului și ultimului element din secvența curentă, dacă este cazul.
 
Funcția de rezolvare returnează apoi variabilele p și u.


În timpul parcurgerii şirului, vom actualiza lungimea_secvenţei şi suma_elementelor pentru fiecare secvenţă găsită, şi vom compara cu valorile maxime găsite până acum, actualizându-le în caz că avem o secvenţă nouă mai bună.
Funcția de validare, validare(p, u), primește ca parametri pozițiile primului și ultimului element din secvența maximă găsită de funcția rezolvare, și are rolul de a scrie aceste valori în fișierul de ieșire secventa.out. Dacă nu s-a găsit nicio secvență cu proprietatea specificată, funcția va scrie -1 în fișierul de ieșire.


După parcurgerea întregului şir, vom afişa valorile p şi u, adică poziţiile de început şi sfârşit ale secvenţei maxime.
În funcția principală if __name__ == "__main__", începem prin citirea datelor de intrare din fișierul `secventa.

Latest revision as of 21:07, 14 May 2023

Sursa: - Secventa


Cerinţa[edit | edit source]

Se dă un şir cu n elemente, numere naturale. Determinaţi cea mai lungă secvenţă de elemente din şir cu proprietatea că oricare două valori consecutive în secvenţă au parităţi diferite.

Dacă există mai multe secvente de lungime maximă cu această proprietate, se va determina aceea cu suma elementelor maximă. Dacă există mai multe secvenţe de lungime maximă cu aceeaşi sumă maximă a elementelor se va determina cea mai din dreapta.

Date de intrare[edit | edit source]

Fişierul de intrare secventa.in conţine pe prima linie numărul n; urmează cele n elemente ale şirului, dispuse pe mai multe linii şi separate prin spaţii.


Date de ieșire[edit | edit source]

Fişierul de ieşire secventa.out va conţine Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou două numere p şi u, separate printr-un spaţiu, reprezentând indicele primului, respectiv al ultimului element din secvenţa determinată, 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 | edit source]

  • 1 ≤ n ≤ 100.000;
  • elementele şirului vor avea cel mult 9 cifre şi sunt numerotate de la 1 la n;

Exemplu 1[edit | edit source]

Intrare
secventa.in
10
2 4 3 6 7 5 2 5 8 10
Ieșire
secventa.out
Datele sunt introduse correct.
6 9

Exemplu 2[edit | edit source]

Intrare
secventa.in
10 2 3 4
1 9 22 13 5 2 5 8 10
Ieșire
Datele nu corespund restricțiilor impuse.


Rezolvare[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 0283 - Secventa

def rezolvare(n, a):

   p = u = -1
   max_lungime = max_suma = 0
   # Cautam secventa maximă
   lungime_secventa = suma_elementelor = 1
   for i in range(1, n):
       if a[i] % 2 == a[i-1] % 2:
           lungime_secventa = 1
           suma_elementelor = a[i]
       else:
           lungime_secventa += 1
           suma_elementelor += a[i]
           if lungime_secventa > max_lungime or (lungime_secventa == max_lungime and suma_elementelor > max_suma):
               max_lungime = lungime_secventa
               max_suma = suma_elementelor
               p = i - lungime_secventa + 1
               u = i
   return p, u

def validare(p, u):

   with open("secventa.out", "w") as f:
       if p == -1:
           f.write("-1\n")
       else:
           f.write(f"{p+1} {u+1}\n")

if __name__ == "__main__":

   try:
       with open("secventa.in", "r") as f:
           n = int(f.readline())
           a = list(map(int, f.readline().split()))
       if n < 1 or n > 100000:
           raise ValueError("Numarul n nu se incadreaza in limitele problemei.")
       for i in range(n):
           if a[i] < 0 or a[i] > 999999999:
               raise ValueError("Elementele sirului trebuie sa fie numere naturale de cel mult 9 cifre.")
       p, u = rezolvare(n, a)
       if p != -1 and u != -1:
           print("Datele sunt introduse corect.")
       else:
           print("Datele nu corespund restricțiilor impuse.")
       validare(p, u)
   except Exception as e:
       print("Datele nu corespund restricțiilor impuse.")
       print(e)


</syntaxhighlight>

Explicatie Rezolvare[edit | edit source]

Funcția de rezolvare, rezolvare(n, a), care primește ca parametri numărul de elemente din șir n și șirul propriu-zis a. Scopul acestei funcții este de a determina cea mai lungă secvență cu proprietatea specificată în enunț și de a returna pozițiile primului și ultimului element din această secvență.

Această funcție începe prin a inițializa variabilele p și u cu valoarea -1, semnificând faptul că încă nu am găsit nicio secvență cu proprietatea specificată. De asemenea, funcția mai inițializează două variabile max_lungime și max_suma cu valoarea 0, care vor fi folosite pentru a determina secvența maximă în ceea ce privește lungimea și suma elementelor.

În continuare, se parcurge șirul a și se calculează lungimea și suma elementelor din secvența curentă, utilizând variabilele lungime_secventa și suma_elementelor. Dacă se întâlnește un element cu paritatea identică cu elementul anterior, secvența curentă se întrerupe și se inițializează lungimea și suma elementelor pentru o nouă secvență începând cu elementul curent. În caz contrar, se actualizează lungimea și suma elementelor din secvența curentă, și se compară aceste valori cu cele ale secvenței maximale găsite până în acel moment (max_lungime și max_suma). Dacă lungimea secvenței curente depășește lungimea secvenței maxime găsite până în acel moment, sau are lungime egală cu aceasta dar suma elementelor este mai mare, atunci secvența curentă devine noua secvență maximă și se actualizează variabilele max_lungime și max_suma. În plus, se actualizează și variabilele p și u cu pozițiile primului și ultimului element din secvența curentă, dacă este cazul.

Funcția de rezolvare returnează apoi variabilele p și u.

Funcția de validare, validare(p, u), primește ca parametri pozițiile primului și ultimului element din secvența maximă găsită de funcția rezolvare, și are rolul de a scrie aceste valori în fișierul de ieșire secventa.out. Dacă nu s-a găsit nicio secvență cu proprietatea specificată, funcția va scrie -1 în fișierul de ieșire.

În funcția principală if __name__ == "__main__", începem prin citirea datelor de intrare din fișierul `secventa.