1598 - Coada1: Difference between revisions
Pagină nouă: Se consideră '''C''' o coadă de numere naturale, iniţial vidă. Se definesc două tipuri de operaţii. Operaţia '''1''' : '''push X''', adaugă elementul '''X''' în coadă. Dacă '''X''' există deja în coadă, se scot toate elementele din coadă, pana la întâlnirea lui, inclusiv '''X'''. Exemplu: '''C: 2 4 5 1 6''' '''Push 5''' '''C: 1 6 5 ( s-au scos 2, 4, 5).''' Operaţia '''2''': '''query X''', cere afişarea poziţiei elementului '''X''' în coada '''C'''. Dac... |
No edit summary |
||
Line 17: | Line 17: | ||
==Date de intrare== | ==Date de intrare== | ||
Fișierul de intrare ''' | Fișierul de intrare '''coada1in.txt''' conține: | ||
*Pe prima linie numărul natural '''M'''; | *Pe prima linie numărul natural '''M'''; | ||
Line 24: | Line 24: | ||
==Date de ieșire== | ==Date de ieșire== | ||
Fișierul de ieșire ''' | Fișierul de ieșire '''coada1out.txt''' va conține: | ||
*Răspunsurile pentru operaţiile de tip '''query''', câte unul pe linie. | *Răspunsurile pentru operaţiile de tip '''query''', câte unul pe linie. | ||
Line 33: | Line 33: | ||
*'''1 ≤ X ≤ 1.000''' | *'''1 ≤ X ≤ 1.000''' | ||
== | ==Exemplul 1:== | ||
; | ;coada1in.txt | ||
10 | |||
push 3 | |||
push 6 | |||
push 8 | |||
push 2 | |||
query 6 | |||
push 6 | |||
query 4 | |||
push 6 | |||
push 7 | |||
query 6 | |||
; | ;coada1out.txt | ||
Datele de intrare corespund restrictiilor impuse | |||
2 | |||
: | -1 | ||
1 | |||
==Exemplul 2:== | |||
;coada1in.txt | |||
coada1 | |||
;coada1out.txt | |||
Datele de intrare nu corespund restrictiilor impuse | |||
==Explicație== | ==Explicație== | ||
Line 66: | Line 77: | ||
<syntaxhighlight lang="python" line="1" start="1"> | <syntaxhighlight lang="python" line="1" start="1"> | ||
# | def validare(m, operatii): # funcția de validare a datelor de intrare | ||
def solve( | if m < 1 or m > 50000: | ||
raise ValueError | |||
for operatie in operatii: | |||
if operatie[0] not in ['push', 'query']: | |||
raise ValueError | |||
x = operatie[1] | |||
if x < 1 or x > 1000: | |||
raise ValueError | |||
file_out.write("Datele de intrare corespund restrictiilor impuse\n") | |||
def solve(operatii): # funcția de rezolvare | |||
queue = [] | queue = [] | ||
output = [] | output = [] | ||
for operatie in operatii: | |||
for | if operatie[0] == 'push': | ||
x = operatie[1] | |||
if | |||
x = | |||
if x in queue: | if x in queue: | ||
queue = queue[queue.index(x)+1:] | queue = queue[queue.index(x)+1:] | ||
queue.append(x) | queue.append(x) | ||
elif operatie[0] == 'query': | |||
elif | x = operatie[1] | ||
x = | |||
if x in queue: | if x in queue: | ||
output.append(queue.index(x) + 1) | output.append(queue.index(x) + 1) | ||
else: | else: | ||
output.append(-1) | output.append(-1) | ||
return output | return output | ||
if __name__ == '__main__': | |||
results = solve( | file_in = open("coada1in.txt", "r") # declararea fisierelor | ||
file_out = open("coada1out.txt", "w") # fisierul out trebuie declarat cu optiunea "w" (write) | |||
try: | |||
M = int(file_in.readline()) | |||
operations = [] | |||
for _ in range(M): | |||
operation = file_in.readline().split() | |||
operation[1] = int(operation[1]) | |||
operations.append(operation) | |||
validare(M, operations) # apelul funcției de validare | |||
results = solve(operations) # apelul funcției de rezolvare | |||
for result in results: | |||
file_out.write(str(result) + '\n') | |||
except ValueError: | |||
file_out.write("Datele de intrare nu corespund restrictiilor impuse") | |||
except IndexError: | |||
file_out.write("Datele de intrare nu corespund restrictiilor impuse") | |||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 18:56, 17 November 2023
Se consideră C o coadă de numere naturale, iniţial vidă. Se definesc două tipuri de operaţii.
Operaţia 1 : push X, adaugă elementul X în coadă. Dacă X există deja în coadă, se scot toate elementele din coadă, pana la întâlnirea lui, inclusiv X. Exemplu: C: 2 4 5 1 6 Push 5 C: 1 6 5 ( s-au scos 2, 4, 5).
Operaţia 2: query X, cere afişarea poziţiei elementului X în coada C. Dacă elementul nu există în coadă, se afişează -1. Exemplu: C: 2 5 1 3 7 Query 1 Răspuns: 3
Cerința[edit | edit source]
Dându-se M, reprezentând numărul de operaţii şi cele M operaţii, să se răspundă la operaţiile de tip query.
Date de intrare[edit | edit source]
Fișierul de intrare coada1in.txt conține:
- Pe prima linie numărul natural M;
- Pe următoarele M linii, câte un string şi câte un număr natural, de forma tip_operaţie x, reprezentând tipul operaţiei şi numărul X.
Date de ieșire[edit | edit source]
Fișierul de ieșire coada1out.txt va conține:
- Răspunsurile pentru operaţiile de tip query, câte unul pe linie.
Restricții și precizări[edit | edit source]
- 1 ≤ M ≤ 50.000
- 1 ≤ X ≤ 1.000
Exemplul 1:[edit | edit source]
- coada1in.txt
10 push 3 push 6 push 8 push 2 query 6 push 6 query 4 push 6 push 7 query 6
- coada1out.txt
Datele de intrare corespund restrictiilor impuse 2 -1 1
Exemplul 2:[edit | edit source]
- coada1in.txt
coada1
- coada1out.txt
Datele de intrare nu corespund restrictiilor impuse
Explicație[edit | edit source]
Înaintea primei întrebări, coada arată asa: 3 6 8 2, deci 6 apare pe poziţia 2. Înaintea celei de-a doua întrebări, coada arată asa: 8 2 6, deci 4 nu apare. Înaintea ultimei întrebări, coada arată asa: 6 7, deci 6 apare pe poziţia 1.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1" start="1">
def validare(m, operatii): # funcția de validare a datelor de intrare
if m < 1 or m > 50000: raise ValueError for operatie in operatii: if operatie[0] not in ['push', 'query']: raise ValueError x = operatie[1] if x < 1 or x > 1000: raise ValueError file_out.write("Datele de intrare corespund restrictiilor impuse\n")
def solve(operatii): # funcția de rezolvare
queue = [] output = [] for operatie in operatii: if operatie[0] == 'push': x = operatie[1] if x in queue: queue = queue[queue.index(x)+1:] queue.append(x) elif operatie[0] == 'query': x = operatie[1] if x in queue: output.append(queue.index(x) + 1) else: output.append(-1) return output
if __name__ == '__main__':
file_in = open("coada1in.txt", "r") # declararea fisierelor file_out = open("coada1out.txt", "w") # fisierul out trebuie declarat cu optiunea "w" (write)
try: M = int(file_in.readline()) operations = [] for _ in range(M): operation = file_in.readline().split() operation[1] = int(operation[1]) operations.append(operation)
validare(M, operations) # apelul funcției de validare results = solve(operations) # apelul funcției de rezolvare
for result in results: file_out.write(str(result) + '\n')
except ValueError: file_out.write("Datele de intrare nu corespund restrictiilor impuse") except IndexError: file_out.write("Datele de intrare nu corespund restrictiilor impuse")
</syntaxhighlight>