0516 - SumSec1: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
Line 74: Line 74:
== Explicație rezolvare==
== Explicație rezolvare==
    
    
Funcția validate_input primește numărul de elemente n și vectorul v și verifică dacă acestea respectă restricțiile impuse. Dacă se găsește o problemă, se va afișa un mesaj de eroare și se va returna False. Altfel, se va returna True.
Funcția citeste_date_intrare() citește cele două tablouri A și B din intrare și le returnează ca o pereche de liste. Funcția valideaza_datele_intrare(a, b) verifică dacă cele două liste respectă constrângerile impuse de problemă și returnează True dacă da și False altfel. Funcția se_poate_reduce(a, b) verifică dacă tabloul A se poate reduce la tabloul B și returnează True dacă da și False altfel.


Funcția suma_elemente_impare primește numărul de elemente n și vectorul v și calculează suma elementelor dintre primul și ultimul element impar din vector.
În funcția principală (if __name__ == '__main__':) se citește numărul de seturi de date de test t, apoi se parcurg t iterații pentru a procesa fiecare set de date. Se citesc cele două tablouri, se validează și se verifică dacă A se poate reduce la B și se afișează rezultatul.
 
Funcția read_input primește datele de intrare și le validează folosind funcția validate_input. Dacă datele sunt valide, acestea vor fi returnate într-un tuplu.
 
În final, în blocul if __name__ == '__main__', se va apela funcția read_input pentru a citi datele de intrare, apoi funcția suma_elemente_impare pentru a calcula suma și se va afișa rezultatul pe ecran.

Revision as of 18:16, 27 April 2023

Sursa: https://www.pbinfo.ro/probleme/516/sumsec1 0516 - SumSec1]


Cerinţa

Se dă un vector format din n elemente, numere naturale. Calculați suma elementelor din secvența determinată de primul și ultimul element impar.

Date de intrare

Programul va citi de la tastatură numărul n, apoi cele n elemente ale vectorului.

Date de ieșire

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.".

Restricţii şi precizări

  • 1 ≤ n ≤ 1000
  • elementele vectorului vor fi mai mici decât 1.000.000
  • vectorul va conţine cel puțin un element impar

Exemplu

Intrare
8
12 10 15 6 7 10 19 14
Ieșire
Datele nu corespund restricțiilor impuse.
5 4

Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 0516 - SumSec1

def validate_input(n, v):

   if n < 1 or n > 1000:
       print("Datele nu corespund restricțiilor impuse.")
       return False
   if not any(x % 2 == 1 for x in v):
       print("vectorul trebuie sa contina cel putin un element impar")
       return False
   for i in range(n):
       if v[i] < 1 or v[i] > 1000000:
           print("Datele nu corespund restricțiilor impuse.")
           return False
   return True

def suma_elemente_impare(n, v):

   first_odd = -1
   last_odd = -1
   for i in range(n):
       if v[i] % 2 == 1:
           if first_odd == -1:
               first_odd = i
           last_odd = i
   return sum(v[first_odd:last_odd+1])

def read_input():

   try:
       n = int(input("Introduceti valoarea lui n: "))
       v = list(map(int, input("Introduceti valorile vectorului, separate prin spatiu: ").split()))
       if not validate_input(n, v):
           print("Datele nu corespund restricțiilor impuse.")
           return None, None
       print("Datele sunt introduse corect.")
       return n, v
   except ValueError:
       print("Datele nu corespund formatului așteptat.")
       return None, None

if __name__ == '__main__':

   n, v = read_input()
   if n is not None and v is not None:
       print(suma_elemente_impare(n, v))

</syntaxhighlight>

Explicație rezolvare

Funcția citeste_date_intrare() citește cele două tablouri A și B din intrare și le returnează ca o pereche de liste. Funcția valideaza_datele_intrare(a, b) verifică dacă cele două liste respectă constrângerile impuse de problemă și returnează True dacă da și False altfel. Funcția se_poate_reduce(a, b) verifică dacă tabloul A se poate reduce la tabloul B și returnează True dacă da și False altfel.

În funcția principală (if __name__ == '__main__':) se citește numărul de seturi de date de test t, apoi se parcurg t iterații pentru a procesa fiecare set de date. Se citesc cele două tablouri, se validează și se verifică dacă A se poate reduce la B și se afișează rezultatul.