Статья Автор: Лебедев Дмитрий

TUZ_2-01_ Вычисление порядкового номера в задаче Иосифа Флавия

TUZ_2-01_ Вычисление порядкового номера в задаче Иосифа Флавия
Задача 50203
Ссылка на задачу в silvertests.ru   Задача Иосифа Флавия
 

TUZ_2-01_ Вычисление порядкового номера в задаче Иосифа Флавия
2.01_ Вычисление порядкового номера в задаче Иосифа Флавия
Задача Иосифа Флавия – широко известная в информатике теоретическая задача. Суть ее заключается в следующем: в круг выстраивается n человек.Из стоящих выбирается k-й человек, который покидает круг. Далее покинувшие круг не участвуют в процессе подсчета, а последний оставшийся считается победителем.
Цель состоит в том, чтобы разработать функцию, которая принимает заданные значения n и k и возвращает порядок, в котором игроки будут покидать круг. Здесь n представляет общее количество людей, а k – количество пропусков. Важно отметить, что k может быть меньше, равно или даже больше n.
Например, рассмотрим рис. 2.1, где в круг встали пять человек. Для k = 2 и n = 5 определите, в каком порядке они будут покидать круг.
Пусть ex – это массив людей, покинувших круг. Поскольку k = 2, то сразу после начала игры выбирается x2 и исключается из круга; ex = [2].
Далее выполняется k шагов по кругу и выбывает 2 + 2 = 4-й участник, т. е. x4; ex = [2, 4]. И снова выполняется k шагов, в результате выбывает участник x1; ex = [2, 4, 1]. Обратите внимание, что при пересечении конца массива происходит переход в его начало (как по кругу), поэтому на предыдущем шаге выбор пал на игрока x1. Теперь в круге остаются x3 и x5. После выполнения k шагов из круга выбывает x5, соответственно, ex = [2, 4, 1, 5]. Последний игрок, оставшийся в круге, – x3, поэтому искомый порядок исключения из круга ex = [2, 4, 1, 5, 3].
В табл. 2.1 показаны некоторые ожидаемые результаты (содержимое массива ex) для разных значений k и n.
Таблица 2.1. Некоторые ожидаемые результаты для разных значений k и n 
n, k Ожидаемый результат 
6, 2 2, 4, 6, 3, 1, 5
5, 2 2, 4, 1, 5, 3
8, 8 8, 1, 3, 6, 5, 2, 7, 4
3, 9 3, 1, 2
4, 3 3, 2, 4, 1


Алгоритм
Алгоритм принимает два аргумента: n – количество людей в круге и k – сколько людей нужно отсчитать, чтобы выбрать следующего для исключения из круга. В результате получается список чисел от 1 до n, представляющих людей в круге. Затем алгоритм последовательно исключает из круга каждого k-го человека, пока не останется только один, и возвращает список в том порядке, в котором люди исключались из круга. Чтобы гарантировать переход через правую границу массива к его началу, используется оператор деления по модулю. Вот подробное описание шагов алгоритма:
1. Принимаются два значения, n и k.
2. Создается список с именем m, содержащий все числа от 1 до n.
3. Создается пустой список с именем ans для хранения результата.
4. Устанавливается переменная i = 0.
5. Создается цикл while, который будет продолжать выполняться, пока список m не опустеет.
6. В цикле while обновляется индекс i по формуле 2.1: к значению i прибавляется k и вычитается 1. Затем вычисляется остаток от деления индекса i на длину m, чтобы гарантировать, что i останется в пределах списка.
7. Вызовом метода pop из списка m исключается элемент с индексом i и добавляется в конец списка ans.
8. По завершении возвращается список ans. 


Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать