Clasa a XII-a · Structuri de date și STLRead in English
queue — eliminarea din cerc în C++
În engleză: queue: elimination in a circle (Josephus)
Ideea
n copii, numerotați de la 1 la n, stau în cerc. Se numără din k în k, iar copilul la care se oprește numărătoarea iese din joc; numărarea continuă cu următorul. Simulăm cercul cu o coadă queue<int>: primii k - 1 copii din față sunt mutați la final (au fost „numărați”), iar al k-lea este scos definitiv și afișat. Repetăm până se golește coada. Afișăm ordinea în care ies copiii.
Descrierea în engleză
n children, numbered from 1 to n, stand in a circle. We count k at a time, and the child where the count stops leaves the game; counting continues with the next one. We simulate the circle with a queue<int>: the first k - 1 children at the front are moved to the back (they were 'counted'), and the k-th is removed for good and printed. We repeat until the queue is empty. We print the order in which the children leave.
- Complexitate
- O(n * k)
- Clasa
- Clasa a XII-a (Grade 12)
- Capitol
- Structuri de date și STL
Exemple
Intrare
7 3
Ieșire așteptată
3 6 2 7 5 1 4
Intrare
5 1
Ieșire așteptată
1 2 3 4 5
Codul C++
Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.
/*
* Titlu: queue — eliminarea din cerc
* Clasa: 12
* Capitol: Structuri de date și STL
* Descriere: n copii, numerotați de la 1 la n, stau în cerc. Se numără din k în k,
* iar copilul la care se oprește numărătoarea iese din joc; numărarea
* continuă cu următorul. Simulăm cercul cu o coadă queue<int>: primii
* k - 1 copii din față sunt mutați la final (au fost „numărați”), iar
* al k-lea este scos definitiv și afișat. Repetăm până se golește
* coada. Afișăm ordinea în care ies copiii.
* Complexitate: O(n * k)
*
* Exemplu
* Intrare: 7 3
* Ieșire: 3 6 2 7 5 1 4
*
* Exemplu
* Intrare: 5 1
* Ieșire: 1 2 3 4 5
*/
#include <iostream>
#include <queue>
using namespace std;
int main()
{
int n, k;
cin >> n >> k;
queue<int> q;
for (int i = 1; i <= n; i++)
q.push(i);
bool primul = true;
while (!q.empty())
{
for (int pas = 1; pas < k; pas++)
{
q.push(q.front());
q.pop();
}
if (!primul)
cout << ' ';
cout << q.front();
primul = false;
q.pop();
}
cout << '\n';
return 0;
}
Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.