Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
3736 - Sir 15
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
Sursă: [https://www.pbinfo.ro/probleme/3736/sir15] == Enunt == Se dă un șir format din '''N''' numere naturale nenule. Elementele șirului sunt numerotate de la stânga la dreapta începând cu poziția '''1'''. == Cerință == Scrieți un program care să determine răspunsul pentru întrebări de următoarele tipuri: 1. Care este cea mai din stânga poziție care conține o valoare strict mai mare decât toate cele din dreapta sa? – întrebare de tipul 1 2. Care sunt pozițiile care conțin valori strict mai mari decât toate cele din stânga lor? – întrebare de tipul 2 3. Dacă fiecărui element aflat între prima și ultima apariție a maximului i-am mări valoarea pentru a ajunge egal cu maximul, care este suma totală a valorilor adăugate? – întrebare de tipul 3 == Date de intrare == Fișierul de intrare '''sir.in''' conține pe prima linie un număr '''C''' (care poate fi '''1, 2 sau 3'''), indicând tipul întrebării. Pe linia a doua se află un număr natural '''N''', reprezentând numărul de elemente din șir. Pe a treia linie a fișierului de intrare se află '''N''' numere naturale, reprezentând elementele șirului, date de la stânga la dreapta (cel mai din stânga are poziția '''1''' și cel mai din dreapta are poziția '''N'''). Numerele de pe această linie sunt separate prin câte un spațiu. == Date de ieșire == Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.". Dacă '''C = 1''', fișierul de ieșire '''sir.out''' trebuie să conțină un număr natural ce reprezintă răspunsul la o întrebare de tipul '''1'''. Dacă '''C = 2''', fișierul de ieșire trebuie să conțină, separați prin câte un spațiu și în ordine crescătoare, indicii determinați ca răspuns la o întrebare de tipul '''2'''. Dacă '''C = 3''', fișierul de ieșire trebuie să conțină un număr ce reprezintă răspunsul la o întrebare de tipul '''3'''. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.". == Restricții și precizări == * '''1 ≤ C ≤ 3''' * '''1 ≤ N ≤ 100.000''' * Numerele din șirul dat sunt cuprinse între 1 și 10.000, inclusiv. * Pentru teste în valoare de 24 de puncte avem '''C = 1'''. * Pentru teste în valoare de 32 de puncte avem '''C = 2'''. * Pentru teste în valoare de 44 de puncte avem '''C = 3'''. == Exemple == === Exemplu 1 === ; '''sir.in''' : 1 : 7 : 3 2 2 5 3 5 4 ; '''sir.out''' : 6 ==== Explicatie ==== Cea mai din stânga poziție a unei valori care este mai mare decât toate cele din dreapta sa este '''6''' (acolo unde se află valoarea '''5''') === Exemplu 2 === ; '''sir.in''' : 2 : 7 : 3 2 2 5 3 5 4 ; '''sir.out''' : 1 4 ==== Explicatie ==== '''1''' și '''4''' sunt pozițiile unde se află valori mai mari decât toate cele din stânga lor. === Exemplu 3 === ; '''sir.in''' : 3 : 8 : 3 2 2 5 3 1 5 4 ; '''sir.out''' : 6 ==== Explicatie ==== Maximul fiind '''5''', conform explicației de la întrebarea de tipul '''3''', trebuie mărite două elemente pentru a ajunge egale cu '''5'''. Acestea sunt cel aflat pe poziția '''5''' (de mărit cu '''2''') precum și cel de pe poziția '''6''' (de mărit cu'''4'''). Suma valorilor cu care avem de mărit este '''2 + 4 = 6'''. === Exemplu 4 === ; '''sir.in''' : 3 : 5 : 3 2 7 5 3 ; '''sir.out''' : 0 ==== Explicatie ==== Maximul este '''7''' și apare o singură dată, deci nu se mai mărește nicio valoare. == Rezolvare == <syntaxhighlight lang="python" line="1"> def citeste_n(): while True: try: with open("sir.in") as fin: c = int(fin.readline().strip()) n = int(fin.readline().strip()) if 1 <= c <= 3 and 1 <= n <= 100000: print("Datele sunt corecte.") return c, n else: print("Datele nu sunt conform restrictiilor impuse.") except ValueError: print("Trebuie introduse doar numere intregi.") def citeste_valori(n): valori = [] with open("sir.in") as fin: fin.readline() fin.readline() for line in fin: for valoare in line.split(): try: valoare = int(valoare) if valoare > 1 and valoare <= 10000: print("Datele sunt corecte.") valori.append(valoare) else: print("Datele nu sunt conform restricțiilor impuse.") except ValueError: print("Trebuie introduse doar valori naturale cu mai putin de 9 cifre.") return valori def sir(c, n, valori): # Cerinta 1 if c == 1: max_val = valori[0] max_pos = 0 ans = -1 for i in range(1, n): if valori[i] > max_val: max_val = valori[i] max_pos = i elif valori[i] < max_val and i > max_pos: ans = max_pos + 1 break with open("sir.out", "w") as fout: fout.write(str(ans)) # Cerinta 2 elif c == 2: max_val = valori[0] ans = [] for i in range(1, n): if valori[i] > max_val: max_val = valori[i] elif valori[i] < max_val and i > 1: ans.append(str(i)) with open("sir.out", "w") as fout: fout.write(" ".join(ans)) # Cerinta 3 elif c == 3: max_val = max(valori) max_pos = [i for i, j in enumerate(valori) if j == max_val] ans = 0 for i in range(max_pos[0]+1, max_pos[-1]): ans += max_val - valori[i] with open("sir.out", "w") as fout: fout.write(str(ans)) if _name_ == "_main_": c, n = citeste_n() valori = citeste_valori(n) sir(c, n, valori) </syntaxhighlight> == Explicatie == Acest cod este o implementare Python a unui algoritm pentru rezolvarea unei probleme matematice, descrisă în enunțul pe care l-ai furnizat anterior. Funcția citeste_n este utilizată pentru a citi valorile necesare din fișierul de intrare, respectiv tipul întrebării c și lungimea șirului n. Această funcție verifică dacă valorile citite sunt valide în conformitate cu restricțiile impuse de cerințe și returnează valorile citite. Funcția citeste_valori este utilizată pentru a citi valorile din fișierul de intrare și verifica dacă sunt valide. Aceasta construiește o listă de valori valori și o returnează. Funcția sir primește lista de valori valori și implementează algoritmii necesari pentru a determina răspunsurile la întrebările specifice. În funcție de tipul întrebării c, se aplică o strategie diferită pentru a obține rezultatul corect. Rezultatele sunt scrise în fișierul de ieșire "sir.out". În final, se citește tipul întrebării și lista de valori din fișierul de intrare și se apelează funcția sir pentru a obține rezultatul.
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width