Grade 12 · Data structures and the STLCitește în română

queue: elimination in a circle (Josephus)

Original: queue — eliminarea din cerc

O(n²)C++1749 lines2 examples

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)

Examples

Example 1

Input

7 3

Expected output

3 6 2 7 5 1 4
Example 2

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.

eliminare-in-cerc-cu-queue.cpp
/*
 * 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.