Informatică, întrebare adresată de Ouroboros, 9 ani în urmă

C++

Se consideră C o coadă de numere naturale, iniţial vidă. Se definesc 2 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
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
Fișierul de intrare coada1.in 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
Fișierul de ieșire coada1.out va conține:

Răspunsurile pentru operaţiile de tip query, câte unul pe linie.
Restricții și precizări
1 <= M <= 50 000
1 <= X <= 1 000



Exemplu
coada1.in

10
push 3
push 6
push 8
push 2
query 6
push 6
query 4
push 6
push 7
query 6
coada1.out

2
-1
1
Explicație
Î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.

Răspunsuri la întrebare

Răspuns de NiceShotVi
1
#include <fstream>

using namespace std;

int main()
{
int is[1000], elem = 0, m, x, aux:
char cs[10];
ifstream fin("coada1.in");
ofstream fout("coada1.out");
fin>>m;
while(m>0)
{
m--; fin>>cs>>x;
if(cs[0]=='p')
{
is[elem] = x; elem++;
for(unsigned int i = 0; i < elem-1; i++)
if(is[i] == x)
{
for(unsinged int j = 0; j < elem - i - 1; j++)
is[j] = is[i+j];
break;
}
}
else
{
aux=-1;
for(unsigned int i = 0; i < elem ; i++)
if(is[i]==x)
{ aux = i+1; break; }
fout<<aux<<endl;
}
}
return 0;
}
Alte întrebări interesante