La un supermarket există două case de marcat la care clienții își pot plăti cumpărăturile. Când intră în magazin, fiecare client primește un număr unic. Când aceștia vor să plătească, se așază la rând la una dintre cele două case. Clienții sunt procesați pe rând, în ordinea venirii lor.
Cerința
Scrieți un program care procesează cozile de la casele de marcat. Acest program primește N
instrucțiuni pe care trebuie să le execute. Aceste instrucțiuni pot fi de următoarele 4 tipuri:
1
– S-a eliberat casa de marcat numărul1
. Trebuie afișat numărul clientului care urmează la rând; dacă nu este nimeni la coadă la casa respectivă, se va afișa-1
.2
– S-a eliberat casa de marcat numărul2
. Trebuie afișat numărul clientului care urmează la rând; dacă nu este nimeni la coadă la casa respectivă, se va afișa-1
.3 x
– Clientul cu numărulx
se așază la coadă la casa la care așteaptă mai puțini clienți; dacă la ambele case așteaptă același număr de clienți, atunci clientul cu numărulx
se va așeza la coadă la casa1
; trebuie afișată coada la care se așază clientulx
. Se garantează că acest client nu este deja așezat la vreun la rând.4 x
– Clientul cu numărulx
părăsește rândul la care așteaptă (se garantează că era deja la un rând); în acest caz nu trebuie afișat nimic.
Date de intrare
Fișierul de intrare supermarket.in
conţine pe prima linie numărul de instrucțiuni N
. Pe fiecare dintre următoarele N
linii se află câte o instrucțiune, în forma descrisă la cerinţă.
Date de ieșire
Fișierul de ieșire supermarket.out
va conţine rezultatele afişate în urma executării instrucţiunilor din fişierul de intrare, în ordinea din fişier, câte un rezultat pe o linie.
Restricții și precizări
4 ≤ N ≤ 100.000
1 ≤ x ≤ 1.000.000
- Pentru teste valorând
30
de puncte,4 ≤ N ≤ 1.000
- Pentru teste valorând
30
de puncte nu vor exista instrucțiuni de tipul4
. - Un client care a părăsit la un moment dat rândul (fie în urma unei instrucțiuni de tipul
4
, fie datorită faptului că a plătit la casă), se poate întoarce și se poate așeza din nou rând (ca și cum ar fi venit prima dată).
Exemplu
supermarket.in
10 3 5 3 21 3 7 2 1 2 3 5 3 8 4 7 1
supermarket.out
1 2 1 21 5 -1 2 1 8
Explicație
Clientul 5
se aşază la rând la casa 1
Clientul 21
se aşază la rând la casa 2
Clientul 7
se aşază la rând la casa 1
La casa 2
intră clientul 21
La casa 1
intră clientul 5
La casa 2
nu este nimeni în așteptare
Clientul 5
se aşază la rând la casa 2
Clientul 8
se aşază la rând la casa 1
Clientul 7
părăseşte rândul (nu se afişează nimic)
La casa 1
intră clientul 8
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema supermarket:
#include <bits/stdc++.h>
#define st first
#define nd second
using namespace std;
const int N = 1000100;
int n, k, m, op, x;
int t[N], sz[3], where[N];
queue <pair<int, int> > q[3];
int main() {
freopen("supermarket.in", "r", stdin);
freopen("supermarket.out", "w", stdout);
ios_base::sync_with_stdio(false);
cin >> n;
assert(n <= 100000);
for(int i = 1; i <= n; i++) {
cin >> op;
assert(op >= 1 && op <= 4);
if(op <= 2) {
while(!q[op].empty() && t[q[op].front().st] != q[op].front().nd)
q[op].pop();
if(q[op].empty()) {
cout << "-1\n";
continue;
}
t[q[op].front().st] = -1; // este scos din coada
where[q[op].front().st] = 0;
cout << q[op].front().st << '\n';
q[op].pop();
sz[op]--;
} else if(op == 3) {
cin >> x;
assert(1 <= x && x <= 1e6);
assert(where[x] == 0);
int sw = 1;
if(sz[1] > sz[2]) sw = 2;
sz[sw]++;
t[x] = i;
q[sw].push({x, i});
where[x] = sw;
cout << sw << '\n';
} else {
cin >> x;
assert(1 <= x && x <= 1e6);
assert(where[x] <= 2 && where[x] > 0);
sz[where[x]]--;
where[x] = 0;
t[x] = -1; // il scot din coada
}
}
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #2895 supermarket
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2895 supermarket de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!