Grade 12 · Data structures and the STLCitește în română
queue: elimination in a circle (Josephus)
Original: queue — eliminarea din cerc
The idea
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.
Original description (Romanian)
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.
- Complexity
- O(n * k)
- Grade
- Grade 12 (Clasa a XII-a)
- Chapter
- Data structures and the STL
Examples
Input
7 3
Expected output
3 6 2 7 5 1 4
Input
5 1
Expected output
1 2 3 4 5
The code
Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.
/*
* 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;
}
Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.