4266 - MITM: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerinta == Fie un număr natural s și un șir de n numere naturale nenule. Să se determine suma maximă posibilă, mai mică sau egală cu s ce se poate obține dintr-un subșir al șirului. == Date de intrare == Programul citește de la tastatură numărul n și s, apoi n numere naturale, separate prin spații, reprezentând elementele șirului. == Date de iesire == Programul va afișa pe ecran numărul M, reprezentând suma maximă posibilă, mai mică sau egală...
 
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Cerinta ==
== Cerinta ==


Fie un număr natural s și un șir de n numere naturale nenule. Să se determine suma maximă posibilă, mai mică sau egală cu s ce se poate obține dintr-un subșir al șirului.
Fie un număr natural '''s''' și un șir de '''n''' numere naturale nenule. Să se determine suma maximă posibilă, mai mică sau egală cu s ce se poate obține dintr-un subșir al șirului.


== Date de intrare ==
== Date de intrare ==


Programul citește de la tastatură numărul n și s, apoi n numere naturale, separate prin spații, reprezentând elementele șirului.
Programul citește de la tastatură numărul '''n''' și '''s''', apoi n numere naturale, separate prin spații, reprezentând elementele șirului.


== Date de iesire ==
== Date de iesire ==


Programul va afișa pe ecran numărul M, reprezentând suma maximă posibilă, mai mică sau egală cu s ce se poate obține dintr-un subșir al șirului.
Programul va afișa pe ecran numărul '''M''', reprezentând suma maximă posibilă, mai mică sau egală cu '''s''' ce se poate obține dintr-un subșir al șirului.


== Restrictii si precizari ==
== Restrictii si precizari ==


*3 n 40
*'''3 ⩽ n ⩽ 40'''
*1 s 2.000.000.000
*'''1 ⩽ s ⩽ 2.000.000.000'''
*Șirul va conține numere naturale nenule mai mici decât 50.000.001.
*Șirul va conține numere naturale nenule mai mici decât 50.000.001.
*Toate elementele șirului vor fi mici sau egale decât s.
*Toate elementele șirului vor fi mici sau egale decât s.
Line 24: Line 24:


;Iesire
;Iesire
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
:19
:19


Line 32: Line 32:
:4 29 2 0
:4 29 2 0
;Iesire
;Iesire
;Datele introduse nu corespund restrictiilor impuse
:Datele introduse nu corespund restrictiilor impuse




== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
def suma_maxima_subsir(n, s, sir):
def verificare_date_intrare(n, s, sir):
    if not (3 <= n <= 40 and 1 <= s <= 2000000000):
        return False
 
    if not all(1 <= x < 50000001 for x in sir):
        return False
 
    return True
 
def suma_maxima_subsir(arr, s):
    n = len(arr)
    suma_maxima = 0
    suma_curenta = 0
     stanga = 0
     stanga = 0
    suma_curenta = 0
    suma_maxima = 0


     for dreapta in range(n):
     for dreapta in range(n):
         suma_curenta += sir[dreapta]
         suma_curenta += arr[dreapta]


         while suma_curenta > s:
         while suma_curenta > s:
             suma_curenta -= sir[stanga]
             suma_curenta -= arr[stanga]
             stanga += 1
             stanga += 1


Line 53: Line 63:
     return suma_maxima
     return suma_maxima


def main():
# Citire date de intrare
     # Citire număr de elemente și suma s
try:
     n, s = map(int, input("Introduceti n si s: ").split())
     n = int(input("Introduceți numărul de elemente: "))
    s = int(input("Introduceți suma dorită: "))
     sir = list(map(int, input("Introduceți șirul de numere separate prin spațiu: ").split()))


     # Citire elemente șirului
     # Verificare date de intrare
     sir = list(map(int, input("Introduceti n numere separate prin spatii: ").split()))
     if not verificare_date_intrare(n, s, sir):
        raise ValueError("Datele introduse nu corespund restricțiilor impuse.")


     # Calcul și afișare rezultat
     # Calculare și afișare rezultat
     rezultat = suma_maxima_subsir(n, s, sir)
     rezultat = suma_maxima_subsir(sir, s)
     print("Suma maximă posibilă este:", rezultat)
     print(f"Suma maximă posibilă mai mică sau egală cu {s} este: {rezultat}")


if __name__ == "__main__":
except ValueError as ve:
     main()
     print(ve)


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 12:00, 29 December 2023

Cerinta[edit | edit source]

Fie un număr natural s și un șir de n numere naturale nenule. Să se determine suma maximă posibilă, mai mică sau egală cu s ce se poate obține dintr-un subșir al șirului.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n și s, apoi n numere naturale, separate prin spații, reprezentând elementele șirului.

Date de iesire[edit | edit source]

Programul va afișa pe ecran numărul M, reprezentând suma maximă posibilă, mai mică sau egală cu s ce se poate obține dintr-un subșir al șirului.

Restrictii si precizari[edit | edit source]

  • 3 ⩽ n ⩽ 40
  • 1 ⩽ s ⩽ 2.000.000.000
  • Șirul va conține numere naturale nenule mai mici decât 50.000.001.
  • Toate elementele șirului vor fi mici sau egale decât s.

Exemplul 1[edit | edit source]

Intrare
5 20
5 10 6 8 3
Iesire
Datele introduse corespund restrictiilor impuse
19

Exemplul 2[edit | edit source]

Intrare
1 1
4 29 2 0
Iesire
Datele introduse nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def verificare_date_intrare(n, s, sir):

   if not (3 <= n <= 40 and 1 <= s <= 2000000000):
       return False
   if not all(1 <= x < 50000001 for x in sir):
       return False
   return True

def suma_maxima_subsir(arr, s):

   n = len(arr)
   suma_maxima = 0
   suma_curenta = 0
   stanga = 0
   for dreapta in range(n):
       suma_curenta += arr[dreapta]
       while suma_curenta > s:
           suma_curenta -= arr[stanga]
           stanga += 1
       suma_maxima = max(suma_maxima, suma_curenta)
   return suma_maxima
  1. Citire date de intrare

try:

   n = int(input("Introduceți numărul de elemente: "))
   s = int(input("Introduceți suma dorită: "))
   sir = list(map(int, input("Introduceți șirul de numere separate prin spațiu: ").split()))
   # Verificare date de intrare
   if not verificare_date_intrare(n, s, sir):
       raise ValueError("Datele introduse nu corespund restricțiilor impuse.")
   # Calculare și afișare rezultat
   rezultat = suma_maxima_subsir(sir, s)
   print(f"Suma maximă posibilă mai mică sau egală cu {s} este: {rezultat}")

except ValueError as ve:

   print(ve)

</syntaxhighlight>

Explicatie[edit | edit source]

Suma maximă mai mică sau egală decât 20 este 17 și se formează doar din numărul 17.