3163 - Secv Max Val: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerinţa == Se dă un șir de '''numar_elemente''' numere naturale și un număr natural '''valoare_maxima'''. Determinați lungimea maximă a unei secvențe cu proprietatea că suma numerelor din aceasta este mai mică sau egală cu '''valoare_maxima'''. == Date de intrare == Fișierul de intrare '''secvmaxval.in''' conține pe prima linie numerele '''numar_elemente''' și '''valoare_maxima''', iar pe a două linie '''numar_elemente''' numere naturale separate prin spați...
 
No edit summary
 
Line 2: Line 2:
Se dă un șir de '''numar_elemente''' numere naturale și un număr natural '''valoare_maxima'''. Determinați lungimea maximă a unei secvențe cu proprietatea că suma numerelor din aceasta este mai mică sau egală cu '''valoare_maxima'''.
Se dă un șir de '''numar_elemente''' numere naturale și un număr natural '''valoare_maxima'''. Determinați lungimea maximă a unei secvențe cu proprietatea că suma numerelor din aceasta este mai mică sau egală cu '''valoare_maxima'''.
== Date de intrare ==
== Date de intrare ==
Fișierul de intrare '''secvmaxval.in''' conține pe prima linie numerele '''numar_elemente''' și '''valoare_maxima''', iar pe a două linie '''numar_elemente''' numere naturale separate prin spații.
Fișierul de intrare '''secvmaxvalin.txt''' conține pe prima linie numerele '''numar_elemente''' și '''valoare_maxima''', iar pe a două linie '''numar_elemente''' numere naturale separate prin spații.
== Date de ieșire ==  
== Date de ieșire ==  
Fișierul de ieșire '''secvmaxval.out''' va conține pe prima linie lungimea maximă a unei secvențe care satisface proprietatea dată.
Fișierul de ieșire '''secvmaxvalout.txt''' va conține pe prima linie lungimea maximă a unei secvențe care satisface proprietatea dată.
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund cerintelor impuse.".
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund cerintelor impuse." , iar daca se indeplinesc, se afiseaza mesajul "Datele de intrare corespund cerintelor impuse."
== Restricţii şi precizări ==
== Restricţii şi precizări ==
* 1 ⩽ '''numar_elemente''' ⩽ 200000  
* 1 ⩽ '''numar_elemente''' ⩽ 200000  
Line 12: Line 12:


== Exemplu 1 ==
== Exemplu 1 ==
; Intrare
; secvmaxvalin.txt
: 5 11
5 11
: 4 5 2 3 9
4 5 2 3 9
 
; secvmaxvalout.txt
Datele de intrare corespund cerintelor impuse.
3
 
==Explicatie==
O secvență de lungime maximă cu suma elementelor mai mică sau egală cu 11 este 5 2 3.


; Ieșire
: 3
<br>
<br>
== Exemplu 2 ==
== Exemplu 2 ==
; Intrare
; secvmaxvalin.txt
: 5 10
5 10
: 1000000001 8 5 19 1
1000000001 8 5 19 1
; Ieșire
; secvmaxvalout.txt
: Datele de intrare nu corespund cerintelor impuse.
Datele de intrare nu corespund cerintelor impuse.
<br>
<br>


== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def lungime_maxima_secventa(n, val, numere):
def lungime_maxima_secventa(numar_elemente, valoare_maxima, numere):
     # Verificare restricții date de intrare
     # Verificare restricții date de intrare
     if not (1 <= n <= 200000 and all(1 <= num <= 1000000000 for num in numere) and 1 <= val <= 263):
     if not (1 <= numar_elemente <= 200000 and 1 <= valoare_maxima <= 263 and all(1 <= num <= 1000000000 for num in numere)):
         with open("secvmaxval.out", "w") as output_file:
         with open("secvmaxvalout.txt", "w", encoding="utf-8") as output_file:
             output_file.write("Datele de intrare nu corespund cerințelor impuse.")
             output_file.write("Datele de intrare nu corespund restricțiilor impuse.")
         return
         return


Line 40: Line 45:
     stanga = 0
     stanga = 0


     for dreapta in range(n):
     for dreapta in range(numar_elemente):
         suma_actuala += numere[dreapta]
         suma_actuala += numere[dreapta]


         while suma_actuala > val:
         while suma_actuala > valoare_maxima:
             suma_actuala -= numere[stanga]
             suma_actuala -= numere[stanga]
             stanga += 1
             stanga += 1
Line 49: Line 54:
         lungime_maxima = max(lungime_maxima, dreapta - stanga + 1)
         lungime_maxima = max(lungime_maxima, dreapta - stanga + 1)


     # Scrierea rezultatului în fișierul de ieșire
     # Scrierea mesajului în fișierul de ieșire
     with open("secvmaxval.out", "w") as output_file:
     with open("secvmaxvalout.txt", "w", encoding="utf-8") as output_file:
        output_file.write("Datele de intrare corespund restricțiilor impuse.\n")
         output_file.write(str(lungime_maxima))
         output_file.write(str(lungime_maxima))


def main():
def main():
     # Citirea datelor din fișierul de intrare
     # Citirea datelor din fișierul de intrare
     with open("secvmaxval.in", "r") as input_file:
     with open("secvmaxvalin.txt", "r", encoding="utf-8") as input_file:
         n, val = map(int, input_file.readline().split())
         numar_elemente, valoare_maxima = map(int, input_file.readline().split())
         numere = list(map(int, input_file.readline().split()))
         numere = list(map(int, input_file.readline().split()))


     # Determinarea lungimii maxime a unei secvențe
     # Determinarea lungimii maxime a unei secvențe
     lungime_maxima_secventa(n, val, numere)
     lungime_maxima_secventa(numar_elemente, valoare_maxima, numere)


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     main()
</syntaxhighlight>
</syntaxhighlight>
==Explicatie==
O secvență de lungime maximă cu suma elementelor mai mică sau egală cu 11 este 5 2 3.

Latest revision as of 19:54, 10 January 2024

Cerinţa[edit | edit source]

Se dă un șir de numar_elemente numere naturale și un număr natural valoare_maxima. Determinați lungimea maximă a unei secvențe cu proprietatea că suma numerelor din aceasta este mai mică sau egală cu valoare_maxima.

Date de intrare[edit | edit source]

Fișierul de intrare secvmaxvalin.txt conține pe prima linie numerele numar_elemente și valoare_maxima, iar pe a două linie numar_elemente numere naturale separate prin spații.

Date de ieșire[edit | edit source]

Fișierul de ieșire secvmaxvalout.txt va conține pe prima linie lungimea maximă a unei secvențe care satisface proprietatea dată. În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund cerintelor impuse." , iar daca se indeplinesc, se afiseaza mesajul "Datele de intrare corespund cerintelor impuse."

Restricţii şi precizări[edit | edit source]

  • 1 ⩽ numar_elemente ⩽ 200000
  • numerele de pe a două linie a fișierului de intrare vor fi mai mici decât 1.000.000.000
  • 1 ⩽ valoare_maxima ⩽ 2^63

Exemplu 1[edit | edit source]

secvmaxvalin.txt
5 11
4 5 2 3 9
secvmaxvalout.txt
Datele de intrare corespund cerintelor impuse.
3

Explicatie[edit | edit source]

O secvență de lungime maximă cu suma elementelor mai mică sau egală cu 11 este 5 2 3.


Exemplu 2[edit | edit source]

secvmaxvalin.txt
5 10
1000000001 8 5 19 1
secvmaxvalout.txt
Datele de intrare nu corespund cerintelor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def lungime_maxima_secventa(numar_elemente, valoare_maxima, numere):

   # Verificare restricții date de intrare
   if not (1 <= numar_elemente <= 200000 and 1 <= valoare_maxima <= 263 and all(1 <= num <= 1000000000 for num in numere)):
       with open("secvmaxvalout.txt", "w", encoding="utf-8") as output_file:
           output_file.write("Datele de intrare nu corespund restricțiilor impuse.")
       return
   suma_actuala = 0
   lungime_maxima = 0
   stanga = 0
   for dreapta in range(numar_elemente):
       suma_actuala += numere[dreapta]
       while suma_actuala > valoare_maxima:
           suma_actuala -= numere[stanga]
           stanga += 1
       lungime_maxima = max(lungime_maxima, dreapta - stanga + 1)
   # Scrierea mesajului în fișierul de ieșire
   with open("secvmaxvalout.txt", "w", encoding="utf-8") as output_file:
       output_file.write("Datele de intrare corespund restricțiilor impuse.\n")
       output_file.write(str(lungime_maxima))

def main():

   # Citirea datelor din fișierul de intrare
   with open("secvmaxvalin.txt", "r", encoding="utf-8") as input_file:
       numar_elemente, valoare_maxima = map(int, input_file.readline().split())
       numere = list(map(int, input_file.readline().split()))
   # Determinarea lungimii maxime a unei secvențe
   lungime_maxima_secventa(numar_elemente, valoare_maxima, numere)

if __name__ == "__main__":

   main()

</syntaxhighlight>