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)

O(n²)C++1749 de linii2 exemple

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)

Exemple

Exemplul 1

Intrare

7 3

Ieșire așteptată

3 6 2 7 5 1 4
Exemplul 2

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.

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;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.