2160 - Prize: Difference between revisions

From Bitnami MediaWiki
Paul Ungur (talk | contribs)
Pagină nouă: Am câștigat un concurs și primim la școală foarte foarte multe echipamente pentru un nou laborator. Pentru amenajarea laboratorului am primit și o sală de clasă. Din păcate în sala de clasă există doar o singură priză, în care ar putea fi conectat doar un singur echipament. Cum nu putem reface imediat instalația electrică, am hotărât să utilizăm prelungitoare. Un prelungitor poate avea una sau mai multe prize în care pot fi conectate echipamente și eve...
 
Paul Ungur (talk | contribs)
No edit summary
 
(3 intermediate revisions by the same user not shown)
Line 10: Line 10:


==Date de ieșire==
==Date de ieșire==
Fișierul de ieșire <span style=“color: red”> prize.out</span> va conține o singură linie pe care va fi scris numărul maxim de echipamente ce pot fi alimentate la curent, utilizând cele <span style=“color: red”> N</span> prelungitoare descrise în fișierul de intrare.
Dacă datele sunt introduse corect, pe ecran se va afișa: '''"Date de intrare valide."''', apoi fișierul de ieșire <span style=“color: red”> prize.out</span> va conține o singură linie pe care va fi scris numărul maxim de echipamente ce pot fi alimentate la curent, utilizând cele <span style=“color: red”> N</span> prelungitoare descrise în fișierul de intrare. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: '''"Date de intrare invalide".'''


==Restricții și precizări==
==Restricții și precizări==
Line 18: Line 18:
==Exemplu:==
==Exemplu:==
<span style=“color: red”> prize.in</span>
<span style=“color: red”> prize.in</span>
3
: 3
3
: 3
2
: 2
5
: 5


: Date de intrare valide
<span style=“color: red”> prize.out</span>
<span style=“color: red”> prize.out</span>
8
: 8


==Explicație==
==Explicație==
Line 36: Line 37:
==Rezolvare==
==Rezolvare==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def validate(n: int, prizes: list) -> bool:
def validare(n, nums):
     """
     if not (1 <= n <= 1000):
    Verifică dacă datele de intrare sunt valide.
        return False
    """
     if not all(0 <= nums <= 5_000_000 for nums in nums):
     if n != len(prizes):
         return False
         return False
    for i in range(n):
        if prizes[i] <= 0:
            return False
     return True
     return True




def read_input_file(file_path: str) -> tuple:
def prize(n, nums):
     """
     s = sum(nums)
     Citește datele de intrare din fișierul specificat.
     fout.write(str(s - (n - 1)))
    """
    fin.close()
    with open(file_path, 'r') as f:
    fout.close()
        n = int(f.readline())
        prizes = []
        for _ in range(n):
            prizes.append(int(f.readline()))
        return n, prizes




def find_max_devices(n: int, prizes: list) -> int:
if __name__ == '__main__':
    """
     fin = open("prize.in")
    Găsește numărul maxim de echipamente ce pot fi alimentate la curentul electric.
     fout = open("prize.out", "w")
    """
    max_devices = 0
    for i in range(n):
        devices = prizes[i]
        for j in range(i):
            if prizes[j] > 0:
                devices += prizes[j] - 1
        if devices > max_devices:
            max_devices = devices
    return max_devices
 
 
def main():
     input_file = 'prize.in'
     output_file = 'prize.out'


     n, prizes = read_input_file(input_file)
    lines = fin.readlines()
     if not validate(n, prizes):
     n = int(lines[0].strip())
    nums = list(map(int, lines[1:]))
     if validare(n, nums):
        print("Date de intrare valide")
        prize(n, nums)
    else:
         print("Date de intrare invalide")
         print("Date de intrare invalide")
        return
    max_devices = find_max_devices(n, prizes)
    with open(output_file, 'w') as f:
        f.write(str(max_devices))


if __name__ == '__main__':
    fin.close()
     main()
     fout.close()


</syntaxhighlight>
</syntaxhighlight>
 
==Explicatie cod:==
==Explicatie==
Funcția validare(n, nums) primește doi parametri: n de tip întreg și nums o listă de numere întregi. Funcția verifică dacă n este în intervalul [1, 1000] și dacă toate numerele din lista nums sunt în intervalul [0, 5000000]. Dacă toate aceste condiții sunt îndeplinite, funcția returnează True, altfel returnează False.
Funcția validate verifică dacă datele de intrare sunt valide. Verifică dacă numărul de prelungitoare este egal cu lungimea listei prizes și dacă fiecare număr din listă este pozitiv.
Funcția prize(n, nums) primește doi parametri: n de tip întreg și nums o listă de numere întregi. Funcția calculează suma tuturor numerelor din lista nums utilizând funcția sum(), iar apoi scade n - 1 din această sumă. Rezultatul obținut este scris în fișierul de ieșire.
 
În blocul if __name__ == '__main__':, se deschid fișierele de intrare și de ieșire. Se citește fiecare linie din fișierul de intrare și se extrag valorile corespunzătoare. Prima linie este citită ca n, iar liniile următoare sunt convertite într-o listă de numere nums. Se validează datele de intrare utilizând funcția validare(n, nums). Dacă datele de intrare sunt valide, se afișează un mesaj de confirmare, se apelează funcția prize(n, nums) și se scrie rezultatul în fișierul de ieșire. Altfel, se afișează un mesaj de eroare.
Funcția read_input_file citește datele de intrare din fișierul specificat. Citeste mai întâi numărul de prelungitoare și apoi citește numărul de prize pentru fiecare prelungitor.
 
Funcția find_max_devices găsește numărul maxim de echipamente ce pot fi alimentate la curentul electric. Folosim două bucle for pentru a itera prin toate prelungitoarele și pentru fiecare prelungitor calculăm numărul maxim de echipamente care pot fi conectate în prelungitor. Adăugăm la acest număr de prize numărul de prize din prelungitoarele anterioare (din listă) minus 1, deoarece numai una dintre prizele acestora poate fi utilizată pentru a conecta prelungitorul curent.
 
În funcția main, citim datele de intrare din fișierul prize.in, verificăm dacă acestea sunt valide și apoi apelăm funcția find_max_devices pentru a obține numărul maxim de echipamente ce pot fi alimentate la curent. Rezultatul este scris în fișierul prize.out.

Latest revision as of 19:02, 29 June 2023

Am câștigat un concurs și primim la școală foarte foarte multe echipamente pentru un nou laborator. Pentru amenajarea laboratorului am primit și o sală de clasă. Din păcate în sala de clasă există doar o singură priză, în care ar putea fi conectat doar un singur echipament. Cum nu putem reface imediat instalația electrică, am hotărât să utilizăm prelungitoare.

Un prelungitor poate avea una sau mai multe prize în care pot fi conectate echipamente și eventual alte prelungitoare. Evident, pentru ca prelungitorul să poată fi utilizat el trebuie să fie alimentat la curentul electric.

Cerința[edit | edit source]

Cunoscând configurația prelungitoarelor să se determine numărul maxim de echipamente ce pot fi alimentate la curentul electric.

Date de intrare[edit | edit source]

Fișierul de intrare prize.in conține pe prima linie numărul natural N, care reprezintă numărul de prelungitoare. Pe următoarele N linii se află N numere naturale nenule, câte un număr pe o linie, reprezentând numărul de prize din fiecare dintre cele N prelungitoare.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Date de intrare valide.", apoi fișierul de ieșire prize.out va conține o singură linie pe care va fi scris numărul maxim de echipamente ce pot fi alimentate la curent, utilizând cele N prelungitoare descrise în fișierul de intrare. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Date de intrare invalide".

Restricții și precizări[edit | edit source]

1 ≤ N ≤ 1000 1 ≤ numărul de prize dintr-un prelungitor ≤ 5 000 000

Exemplu:[edit | edit source]

prize.in

3
3
2
5
Date de intrare valide

prize.out

8

Explicație[edit | edit source]

O modalitate de conectare a prelungitoarelor pentru a alimenta la curent echipamente ar fi:

punem în priză prelungitorul 3; prelungitorul 1 îl punem în una dintre prizele prelungitorului 3 (mai rămân în prelungitorul 3 patru prize libere pentru echipamente) prelungitorul 2 îl punem în una dintre prizele prelungitorului 1 (mai rămân în prelungitorul 1 două prize libere pentru echipamente). În total vor exista 4+2+2=8 prize disponibile pentru echipamente.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def validare(n, nums):

   if not (1 <= n <= 1000):
       return False
   if not all(0 <= nums <= 5_000_000 for nums in nums):
       return False
   return True


def prize(n, nums):

   s = sum(nums)
   fout.write(str(s - (n - 1)))
   fin.close()
   fout.close()


if __name__ == '__main__':

   fin = open("prize.in")
   fout = open("prize.out", "w")
   lines = fin.readlines()
   n = int(lines[0].strip())
   nums = list(map(int, lines[1:]))
   if validare(n, nums):
       print("Date de intrare valide")
       prize(n, nums)
   else:
       print("Date de intrare invalide")
   fin.close()
   fout.close()

</syntaxhighlight>

Explicatie cod:[edit | edit source]

Funcția validare(n, nums) primește doi parametri: n de tip întreg și nums o listă de numere întregi. Funcția verifică dacă n este în intervalul [1, 1000] și dacă toate numerele din lista nums sunt în intervalul [0, 5000000]. Dacă toate aceste condiții sunt îndeplinite, funcția returnează True, altfel returnează False. Funcția prize(n, nums) primește doi parametri: n de tip întreg și nums o listă de numere întregi. Funcția calculează suma tuturor numerelor din lista nums utilizând funcția sum(), iar apoi scade n - 1 din această sumă. Rezultatul obținut este scris în fișierul de ieșire. În blocul if __name__ == '__main__':, se deschid fișierele de intrare și de ieșire. Se citește fiecare linie din fișierul de intrare și se extrag valorile corespunzătoare. Prima linie este citită ca n, iar liniile următoare sunt convertite într-o listă de numere nums. Se validează datele de intrare utilizând funcția validare(n, nums). Dacă datele de intrare sunt valide, se afișează un mesaj de confirmare, se apelează funcția prize(n, nums) și se scrie rezultatul în fișierul de ieșire. Altfel, se afișează un mesaj de eroare.