1598 - Coada1: Difference between revisions

From Bitnami MediaWiki
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 '''coada1.in''' conține:
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 '''coada1.out''' va conține:
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'''


==Exemplu:==
==Exemplul 1:==


;coada1.in
;coada1in.txt


:10
10
:push 3
push 3
:push 6
push 6
:push 8
push 8
:push 2
push 2
:query 6
query 6
:push 6
push 6
:query 4
query 4
:push 6
push 6
:push 7
push 7
:query 6
query 6


;coada1.out
;coada1out.txt


:2
Datele de intrare corespund restrictiilor impuse
:-1
2
:1
-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">


# Definim funcția 'solve' care primește numărul de operații 'M' și o listă de operații
def validare(m, operatii):  # funcția de validare a datelor de intrare
def solve(M, operations):
    if m < 1 or m > 50000:
    # Inițializăm coada ca o listă goală
        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 = []
    # Inițializăm lista de rezultate ca o listă goală
     output = []
     output = []
    # Parcurgem fiecare operație
     for operatie in operatii:
     for operation in operations:
         if operatie[0] == 'push':
        # Dacă operația este 'push'
             x = operatie[1]
         if operation[0] == 'push':
            # Extragem valoarea 'x'
             x = operation[1]
            # Dacă 'x' se află deja în coadă
             if x in queue:
             if x in queue:
                # Eliminăm toate elementele din coadă până la 'x', inclusiv 'x'
                 queue = queue[queue.index(x)+1:]
                 queue = queue[queue.index(x)+1:]
            # Adăugăm 'x' la sfârșitul cozii
             queue.append(x)
             queue.append(x)
        # Dacă operația este 'query'
         elif operatie[0] == 'query':
         elif operation[0] == 'query':
             x = operatie[1]
            # Extragem valoarea 'x'
             x = operation[1]
            # Dacă 'x' se află în coadă
             if x in queue:
             if x in queue:
                # Adăugăm poziția lui 'x' în coadă la rezultate
                 output.append(queue.index(x) + 1)
                 output.append(queue.index(x) + 1)
             else:
             else:
                # Dacă 'x' nu se află în coadă, adăugăm -1 la rezultate
                 output.append(-1)
                 output.append(-1)
    # Returnăm lista de rezultate
     return output
     return output


# Definim numărul de operații și lista de operații
M = 10
operations = [
    ['push', 3],
    ['push', 6],
    ['push', 8],
    ['push', 2],
    ['query', 6],
    ['push', 6],
    ['query', 4],
    ['push', 6],
    ['push', 7],
    ['query', 6]
]


# Apelăm funcția 'solve' cu numărul de operații și lista de operații
if __name__ == '__main__':
results = solve(M, operations)
    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')


# Deschidem fișierul 'coada1.out' pentru scriere
    except ValueError:
with open('coada1.out', 'w') as f:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    # Scriem fiecare rezultat pe câte o linie nouă în fișier
     except IndexError:
     for result in results:
         file_out.write("Datele de intrare nu corespund restrictiilor impuse")
         f.write(str(result) + '\n')


</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>