2818 - Inserare 2: Difference between revisions
Nagy Lenard (talk | contribs) No edit summary |
|||
(3 intermediate revisions by 2 users not shown) | |||
Line 9: | Line 9: | ||
== Date de ieșire == | == Date de ieșire == | ||
Dacă datele sunt introduse corect, pe ecran: | Dacă datele sunt introduse corect, pe ecran: | ||
"Datele sunt introduse corect.",fișierul de ieșire inserare2.out va conține poziția din al doilea șir începând de la care poate fi inserat primul șir, astfel încât șirul obținut să fie strict crescător. Dacă nu există o astfel de poziție, se afișează mesajul imposibil.. În cazul în care datele nu respectă restricțiile, se va afișa: "Datele nu corespund restricțiilor impuse.". | "Datele sunt introduse corect.",fișierul de ieșire '''inserare2.out''' va conține poziția din al doilea șir începând de la care poate fi inserat primul șir, astfel încât șirul obținut să fie strict crescător. Dacă nu există o astfel de poziție, se afișează mesajul imposibil.. În cazul în care datele nu respectă restricțiile, se va afișa: "Datele nu corespund restricțiilor impuse.". | ||
== Restricţii şi precizări == | == Restricţii şi precizări == | ||
*Pentru determinarea numerelor cerute se utilizează un algoritm eficient din punctul de vedere al memoriei necesare și al timpului de executare. | *Pentru determinarea numerelor cerute se utilizează un algoritm eficient din punctul de vedere al memoriei necesare și al timpului de executare. | ||
Line 22: | Line 23: | ||
:7 10 12 20 30 40 | :7 10 12 20 30 40 | ||
; ''Ecran'' | ; ''Ecran'' | ||
Datele sunt introduse corect. | :Datele sunt introduse corect. | ||
; ''inserare2.out'' | ; ''inserare2.out'' | ||
:imposibil | :imposibil | ||
Line 31: | Line 32: | ||
:5 15 25 35 | :5 15 25 35 | ||
; ''Ecra'' | ; ''Ecra'' | ||
Datele sunt introduse corect. | :Datele sunt introduse corect. | ||
; ''inserare2.out'' | ; ''inserare2.out'' | ||
imposibil | :imposibil | ||
===Exemplul 3=== | ===Exemplul 3=== | ||
; ''inserare2.in'' | ; ''inserare2.in'' | ||
5 6 | :5 6 | ||
2 4 6 8 10 | :2 4 6 8 10 | ||
1 3 5 7 9 11 | :1 3 5 7 9 11 | ||
; ''Ecran'' | ; ''Ecran'' | ||
Datele nu corespund restricțiilor impuse | :Datele nu corespund restricțiilor impuse | ||
; ''inserare2.out'' | ; ''inserare2.out'' | ||
imposibil | :imposibil | ||
<br> | <br> | ||
Line 64: | Line 65: | ||
# Găsește poziția din al doilea șir începând de la care poate fi inserat primul șir, | # Găsește poziția din al doilea șir începând de la care poate fi inserat primul șir, | ||
# astfel încât șirul obținut să fie strict crescător | # astfel încât șirul obținut să fie strict crescător | ||
pozitie = 1 | |||
for i in range(m): | for i in range(m): | ||
if B[i] >= A[0]: | if B[i] >= A[0]: | ||
while | while pozitie < n and A[pozitie] <= B[i]: | ||
pozitie += 1 | |||
if | if pozitie == n: | ||
return i + 1 | return i + 1 | ||
return "imposibil" | return "imposibil" | ||
Line 98: | Line 99: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Explicatie== | |||
Funcția validate_input(n, m, A, B) verifică dacă datele de intrare sunt valide, adică: | |||
n și m sunt numere întregi între 1 și 10^6; | |||
lungimea listelor A și B este respectiv n și m; | |||
listele A și B sunt strict crescătoare, adică fiecare element este mai mic decât elementul următor. | |||
Funcția returnează True dacă datele sunt valide și False în caz contrar. | |||
Funcția find_insertion_position(n, m, A, B) primește două liste de numere (A și B) și încearcă să găsească poziția din lista B începând de la care se poate insera lista A astfel încât lista rezultată să fie strict crescătoare. | |||
Pentru a face acest lucru, funcția parcurge lista B și caută primul element care este mai mare sau egal cu primul element din lista A. Apoi, parcurge lista A și caută primul element care este mai mare decât ultimul element din secțiunea anterioară din lista A care a fost deja inserată în lista B. Dacă nu există un astfel de element, atunci inserarea este imposibilă. | |||
Funcția returnează poziția de inserare (în formatul specificat în enunțul problemei) sau stringul "imposibil" dacă inserarea este imposibilă. | |||
În blocul if __name__ == '__main__': citim datele de intrare din fișierul "inserare2.in" și apoi verificăm dacă datele sunt valide folosind funcția validate_input(n, m, A, B). Dacă datele nu sunt valide, se afișează un mesaj corespunzător și se oprește execuția programului. | |||
Dacă datele sunt valide, se apelează funcția find_insertion_position(n, m, A, B) pentru a găsi poziția de inserare și se afișează un mesaj de confirmare a validității datelor. Apoi, rezultatul este afișat în fișierul de ieșire "inserare2.out". Observați că, în cazul în care inserarea este imposibilă, se afișează stringul "imposibil" în locul poziției de inserare. |
Latest revision as of 16:41, 29 April 2023
Cerinţa[edit | edit source]
Numim inserare a unui șir A într-un șir B introducerea, între două elemente ale șirului B, a tuturor elementelor lui A, pe poziții consecutive, în ordinea în care apar în A.
Se dau două șiruri cu n, respectiv m elemente numere întregi ordonate strict crescător, în care numerotarea elementelor începe de la 1.
Se cere să se afișeze poziția din al doilea șir începând de la care poate fi inserat primul șir, astfel încât șirul obținut să fie strict crescător. Dacă nu există o astfel de poziție, se afișează mesajul imposibil.
Date de intrare[edit | edit source]
Fișierul de intrare inserare2.in conține numere naturale din intervalul [1,10^6]: pe prima linie numerele m și n, iar pe fiecare dintre următoarele două linii câte un șir de m, respectiv de n numere întregi ordonate strict crescător. Numerele aflate pe aceeași linie a fișierului sunt separate prin câte un spațiu.
Date de ieșire[edit | edit source]
Dacă datele sunt introduse corect, pe ecran: "Datele sunt introduse corect.",fișierul de ieșire inserare2.out va conține poziția din al doilea șir începând de la care poate fi inserat primul șir, astfel încât șirul obținut să fie strict crescător. Dacă nu există o astfel de poziție, se afișează mesajul imposibil.. În cazul în care datele nu respectă restricțiile, se va afișa: "Datele nu corespund restricțiilor impuse.".
Restricţii şi precizări[edit | edit source]
- Pentru determinarea numerelor cerute se utilizează un algoritm eficient din punctul de vedere al memoriei necesare și al timpului de executare.
- Se recomandă evitarea memorării elementelor șirului într-un tablou sau în altă structură de date similară.
Exemple[edit | edit source]
Exemplul 1[edit | edit source]
- inserare2.in
- 4 6
- 15 16 17 19
- 7 10 12 20 30 40
- Ecran
- Datele sunt introduse corect.
- inserare2.out
- imposibil
Exemplul 2[edit | edit source]
- inserare2.in
- 3 4
- 10 20 30
- 5 15 25 35
- Ecra
- Datele sunt introduse corect.
- inserare2.out
- imposibil
Exemplul 3[edit | edit source]
- inserare2.in
- 5 6
- 2 4 6 8 10
- 1 3 5 7 9 11
- Ecran
- Datele nu corespund restricțiilor impuse
- inserare2.out
- imposibil
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1">
- 2818 - Inserare 2
def validate_input(n, m, A, B):
# Verifică dacă datele de intrare corespund restricțiilor impuse if not (1 <= n <= 10 ** 6 and 1 <= m <= 10 ** 6): return False if len(A) != n or len(B) != m: return False if any(A[i] >= A[i + 1] for i in range(n - 1)) or any(B[i] >= B[i + 1] for i in range(m - 1)): return False return True
def find_insertion_position(n, m, A, B):
# Găsește poziția din al doilea șir începând de la care poate fi inserat primul șir, # astfel încât șirul obținut să fie strict crescător pozitie = 1 for i in range(m): if B[i] >= A[0]: while pozitie < n and A[pozitie] <= B[i]: pozitie += 1 if pozitie == n: return i + 1 return "imposibil"
if __name__ == '__main__':
# Citire date de intrare try: with open("inserare2.in", "r") as fin: m, n = map(int, fin.readline().split()) B = list(map(int, fin.readline().split())) A = list(map(int, fin.readline().split())) except ValueError: print("Datele nu corespund restricțiilor impuse.") exit()
# Validare date de intrare if not validate_input(n, m, A, B): print("Datele nu corespund restricțiilor impuse.") exit()
# Găsire poziție de inserare și afișare rezultat result = find_insertion_position(n, m, A, B) print("Datele sunt introduse corect.") with open("inserare2.out", "w") as fout: fout.write(str(result) + "\n" if result != "imposibil" else "imposibil\n")
</syntaxhighlight>
Explicatie[edit | edit source]
Funcția validate_input(n, m, A, B) verifică dacă datele de intrare sunt valide, adică:
n și m sunt numere întregi între 1 și 10^6; lungimea listelor A și B este respectiv n și m; listele A și B sunt strict crescătoare, adică fiecare element este mai mic decât elementul următor. Funcția returnează True dacă datele sunt valide și False în caz contrar.
Funcția find_insertion_position(n, m, A, B) primește două liste de numere (A și B) și încearcă să găsească poziția din lista B începând de la care se poate insera lista A astfel încât lista rezultată să fie strict crescătoare.
Pentru a face acest lucru, funcția parcurge lista B și caută primul element care este mai mare sau egal cu primul element din lista A. Apoi, parcurge lista A și caută primul element care este mai mare decât ultimul element din secțiunea anterioară din lista A care a fost deja inserată în lista B. Dacă nu există un astfel de element, atunci inserarea este imposibilă.
Funcția returnează poziția de inserare (în formatul specificat în enunțul problemei) sau stringul "imposibil" dacă inserarea este imposibilă.
În blocul if __name__ == '__main__': citim datele de intrare din fișierul "inserare2.in" și apoi verificăm dacă datele sunt valide folosind funcția validate_input(n, m, A, B). Dacă datele nu sunt valide, se afișează un mesaj corespunzător și se oprește execuția programului.
Dacă datele sunt valide, se apelează funcția find_insertion_position(n, m, A, B) pentru a găsi poziția de inserare și se afișează un mesaj de confirmare a validității datelor. Apoi, rezultatul este afișat în fișierul de ieșire "inserare2.out". Observați că, în cazul în care inserarea este imposibilă, se afișează stringul "imposibil" în locul poziției de inserare.