0398 - Plopi 2
Cerinţa[edit | edit source]
De-a lungul principalei străzi din orașul nostru există n plopi, pentru fiecare cunoscându-se înălțimea. Primarul orașului dorește ca plopii să aibă înălțimile în ordine descrescătoare. Pentru aceasta, este posibilă tăierea dintr-un plop a unei bucăți – este o tehnică ecologică, nevătămătoare, în urma căreia plopul nu are de suferit. Plopii nu pot fi înălțați în niciun fel.
Determinați numărul minim de plopi din care se va tăia și lungimea totală minimă a bucăților tăiate.
Date de intrare[edit | edit source]
Fișierul de intrare plopi2in.txt conține pe prima linie numărul de plopi n. Urmează n numere naturale nenule, separate prin spaţii, care pot fi dispuse pe mai multe linii, reprezentând înălțimile plopilor.
Date de ieşire[edit | edit source]
Fișierul de ieșire plopi2out.txt va conține pe prima linie numerele C T, separate prin exact un spațiu, reprezentând numărul minim de plopi din care se va tăia și lungimea totală minimă a bucăților tăiate.
Restricții și precizări[edit | edit source]
- 2 ⩽ n ⩽ 100
- înălțimile plopilor vor fi mai mici decât 10000
Exemplul 1[edit | edit source]
- plopi2in.txt
8 5 7 3 6 4 4 2 6
- plopi2out.txt
Datele de intrare corespund restrictiilor impuse. 5 11
Explicație[edit | edit source]
Vom tăia din plopii numerotați cu 2 4 5 6 8, astfel încât înălțimile să devină 5 5 3 3 3 3 2 2. Lungimea totală a bucăților tăiate este: 2 + 3 + 1 + 1 +4 = 11
Exemplul 2[edit | edit source]
- plopi2in.txt
yrteofmnrf
- plopi2out.txt
Datele de intrare nu corespund restrictiilor impuse.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- Funcția de validare verifică dacă datele de intrare sunt în intervalul specificat
def validare(n_validare, inaltimi_validare):
# Verificăm dacă n este în intervalul 2-100 if n_validare < 2 or n_validare > 100: raise ValueError # Ridicăm o eroare dacă n nu este în intervalul 2-100 for inaltime in inaltimi_validare: # Parcurgem lista de înălțimi # Verificăm dacă înălțimea este mai mică decât 10000 if inaltime >= 10000: raise ValueError file_out.write("Datele de intrare corespund restrictiilor impuse.\n")
- Funcția taie_plopi taie plopii astfel încât să aibă înălțimile în ordine descrescătoare
def taie_plopi(n_taie, inaltimi_taie):
# Inițializăm numărul de plopi din care se va tăia și lungimea totală a bucăților tăiate nr_plopi, lungime_totala = 0, 0 # Parcurgem lista de înălțimi for i in range(1, n_taie): # Dacă înălțimea plopului curent este mai mare decât înălțimea plopului anterior if inaltimi_taie[i] > inaltimi_taie[i-1]: # Tăiem din plop lungime_totala += inaltimi_taie[i] - inaltimi_taie[i-1] inaltimi_taie[i] = inaltimi_taie[i-1] nr_plopi += 1 return nr_plopi, lungime_totala
if __name__ == '__main__':
file_in = open("plopi2in.txt", "r") file_out = open("plopi2out.txt", "w")
try: # Citim numărul de plopi n_main = int(file_in.readline()) # Citim înălțimile plopilor inaltimi_main = list(map(int, file_in.readline().split())) # Validăm datele de intrare validare(n_main, inaltimi_main) # Tăiem plopii nr_plopi_main, lungime_totala_main = taie_plopi(n_main, inaltimi_main) # Scriem numărul de plopi din care se va tăia și lungimea totală a bucăților tăiate în fișierul de ieșire file_out.write(str(nr_plopi_main) + ' ' + str(lungime_totala_main) + '\n')
# Dacă datele de intrare nu sunt valide, afișăm un mesaj de eroare except ValueError: file_out.write("Datele de intrare nu corespund restrictiilor impuse.") # Dacă datele de intrare sunt incomplete, afișăm un mesaj de eroare except IndexError: file_out.write("Datele de intrare nu corespund restrictiilor impuse.")
</syntaxhighlight>