Задачи
September 2

Задача. Горячая картошка

Задача. Стоят N школьников в одной шеренге (от 1 до N).

  • Первый школьник держит в руках горячую картошку.
  • Каждую секунду школьник, держащий картошку, передает ее следующему.
  • Как только картошка доходит до конца, направление меняется, и школьники продолжают передавать картошку в обратном направлении.

Даны два положительных целых числа N и Time. Верните номер школьника, держащего картошку, по истечении Time секунд.

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

  • 2 <= N <= 1000
  • 1 <= Time <= 1000

Пример:

1. N = 4; Time = 5
Output: 2
Примечание: 1 -> 2 -> 3 -> 4 -> 3 -> 2

Разбор

Давайте смоделируем процесс.

  • Картошка проходит полный круг, когда она перемещается от 1го школьника к последнему или наоборот. Каждый полный круг занимает N - 1 секунд, где N - общее количество школьников.
  • Чтобы определить, сколько полных кругов совершает картошка за заданное время, мы делим время на N - 1.
  • А остаток от такого деления, extraTime = Time % (N - 1), показывает дополнительное время, оставшееся после завершения этих полных раундов.

Рассмотрим направление движения картошки:

  • Если FullRounds четное, картошка движется вперед по шеренге.
  • Если FullRounds нечетное, картошка движется назад.
  • Это изменение направления происходит после каждого полного раунда.

В случае движения вперед, школьник, держащий картошка после дополнительного времени, будет находиться в позиции extraTime + 1. При движении назад школьник, держащий картошку, будет находиться в позиции n - extraTime.

Реализация

static int HotPotato(int n, int time) {
    int full = time / (n - 1);
    int extra = time % (n - 1);

    int direction = full % 2 == 0 ? 1 : -1;
    return direction == 1 ? extra + 1 : n - extra;
}

https://gist.github.com/unilecs/94f15271fe9cc51cd6ee3df1e1e1def5

Play-test

https://dotnetfiddle.net/Xlu3vV