UniLecs #Task. Считалочка

Albert Davletov
UniLecs
Published in
2 min readOct 7, 2019

--

Dream (dev)-team

Задача: команда программистов не выполнила проект в срок! Теперь они не могут решить, кто пойдет к заказчику за новым дедлайном. Не придумали ничего лучше, как определить с помощью детской считалочки.
Определите кто из программистов пойдет к заказчику?

Входные данные:

  • N — количество программистов в команде;
  • Str — массив слов (считалочка);
  • K — номер программиста, с которого начнется считалочка.
    1 <= K <= N; N <= Str.Length <= 10⁵.

Примеры: N = 4; K = 2;

Str = [ “Вышел”, “месяц”, “из”, “тумана”,
“Вынул”, “ножик”, “из”, “кармана”,
“Буду”, “резать”, “буду”, “бить”,
“Всё”, “равно”, “тебе”, “водить”]
Answer: 1

Разбор

Обозначим Count — количество слов в считалочке.

Сначала решим задачу без сдвига, т.е. для k = 1. Заметим, что (Count%N) (% — операция остаток от деления) дает хорошие результаты, если считалочкой выбирается любой, кроме N-го участника. Если же выбор падает на него, то остаток от деления равен 0. Для этого изменим опрецию:

результат определяется формулой (Count — 1) % N + 1.

Теперь сдвиг — это по сути то же вычисление, только уже изначально было сделано еще k-1 ходов.

Поэтому прибавляя к C еще k-1 шагов и получаем финальную формулу (Count + k — 2) % N+1

Реализация

C#

https://gist.github.com/unilecs/9ae436042a14ca3dac2173e84fd95c05

Play-test

https://dotnetfiddle.net/g49UpF

--

--