Алгоритм сиденья унитаза

Давайте возьмем некоторый обычный дом с человеком, который должен перейти к туалету каждый n минуты, требуя, чтобы место произошло, и женщина, которая должна сделать это каждый m минуты, требуя, чтобы место снизилось. Есть ли возможность создать a O(1) алгоритм, который произведет точное количество перемещений сиденья унитаза за установленный срок X минуты? Существует два различных дополнительных исходных данных:
1. Человек всегда оставляет на виду место после посещения.
2. Человек всегда подавляет место после посещения.

Заключение: в реальной жизни (который включает n будучи намного больше, чем m, с X-> бесконечность), доказано, что нет никакого различия во многих перемещениях места.
Но если человек будет делать это чаще, то женщина, это продлит жизнь места, если он просто оставит на виду место, но является этим случаем, один из них (или оба) должен, вероятно, обратиться к врачу.
Теперь я знаю то, что является лучшим для самого места, но какой человек делает больше перемещений - другой вопрос (который нельзя спросить так или иначе).

32
задан 16 revs, 2 users 100% 24 February 2010 в 15:54
поделиться

5 ответов

для 2 , ответ 2 * этаж (X / N) . Человек всегда пойдет в ванную с унитазом вниз и оставит его. Женщина никогда не станет его, так как это только когда человек идет в ванную.

1 немного сложнее.

Править: Дух. Для 1 Ответ 2 * этаж (X / M) . Только сиденье унитаза, когда женщина идет в ванную.

Редактировать2: плюс или минус начальное состояние унитаза.

Редактировать3: мой ответ на 1 только правильно, если m> = n . Я выясню остальные позже.

Редактировать4: если n> = 2m , то это 2 * этаж (x / n) , поскольку сиденье будет только переход, когда человек идет PEE. Если n> m , я считаю, что ответ также 2 * этаж (X / N) , но мне нужно поработать математику.

Редактировать5: Итак, для 2M> N> M , переходы сиденья, когда мужчина идет мочиться за женщиной и наоборот. Последовательность посещения человека / женщины повторяет каждую mieme_common_multiple (m, n) минут, поэтому нам нужно только относиться к тому, что происходит в этот период времени. Единственный раз, когда сиденье не будет переход, когда человек использует это, если ему удалось ввести его дважды подряд. Учитывая, что женщина посещает больше , часто, чем мужчина, между каждым посещением человека есть хотя бы одна женщина. (Дважды в начале или конце.)

Ответ 1 Тогда становится: (N> M? 2 * Этаж (X / N): 2 * этаж (x / м)) + (остаток )> Остальная часть (х / м)? 1: 0) . Или что-то типа того.

7
ответ дан 27 November 2019 в 21:13
поделиться
[11255146-

Если все минутные переменные являются целыми числами, то вы могли бы сделать это так:

int toilet_seat_movements = 0;
bool seat_up = false;

for (i = 0; i <= total_minutes; i++)
{
    if (seat_up)
    {
        if (i % woman_minutes == 0)
            toilet_seat_movements++;
    }
    else
    {
        if (i % man_minutes == 0)
            toilet_seat_movements++;
    }
}

return toilet_seat_movements;
0
ответ дан 27 November 2019 в 21:13
поделиться

Да, есть базовый алгоритм O(1).

Я начинаю с предположения, что оба человека начинают "тикать" при t=0. Я считаю, что решение должно быть обобщено на разные стартовые времена, но нетрудно перейти от одного "свободного конца" временной шкалы к двум концам.

Предположим, что n <= m.

Тогда наша временная шкала выглядит так ("x" обозначает "движение", а не визит)

  0     m    2m    ..              t-t%m  t
  +-----+-----+-----+-----+-----+-----+--o
W x     x     x     x     x     x     x 
M x  x    x    x       x     x    x     x?

Итак, женщина идет по времени этажа(t/m) и между каждый раз, когда женщина уходит -- в полуоткрытом интервале (a*m,*m+m] -- человек ходит хотя бы один раз, таким образом перевернув сиденье один раз. за то. каждый раз, когда она переворачивает сиденье за промежуток времени, он также переворачивает его один раз. Тем не менее, он, возможно, пойдет еще раз после того, как ее последняя поездка, в зависимости от их относительного времени, которые вы можете рассчитать на основе t modulo их соответствующих периодов.

total_moves = floor(t/m) * 2 + (t%m < t%n ? 1 : 0)

Теперь в случае n > m.

Роли женщины и мужчины меняются на противоположные... полуоткрытый интервал. [an, an+n) всегда будет два хода. Остальное линии [t-t-t%n, t), в которой человек идет один раз в начале, (что означает +1 ход, но мы посчитали +2 для обоих ходов при t=0, который мы, вероятно, должны отбросить), и женщина идет, если у нее осталось равное или меньшее время, чем у него

total_moves = floor(t/n) * 2 - 1 + (t%m >= t%n ? 1 : 0)
14
ответ дан 27 November 2019 в 21:13
поделиться

Да, по крайней мере, когда реализация может предположить, что цикл для человека и женщины известен заранее, и что он не изменяется:

Начните с наименее распространенных Несколько времен цикла человека / женщины ( LCM ). Закалить движения в течение этого периода времени ( lcm_movements ). Теперь вам нужно только иметь дело с вашим входом Modulo LCM . Для этого вы можете просто настроить таблицу фиксированной длины, содержащую количество движений на каждую минуту.

Учитывая время время и LCM целых чисел в Java / C / C ++ / C # Фактический расчет может быть это:

return ( time / lcm ) * lcm_movements + movements[ time % lcm ];
4
ответ дан 27 November 2019 в 21:13
поделиться

Допущения:

  • Начнем с T = 0 с сиденьем унитаза вниз
  • Если человек и женщина приезжают в то же время, то дамы первыми.

Пусть lastladytime: = пол (x / m) * m и lastmantime: = пол (x / n) * n. Они представляют собой последнее время использования туалета. Выражение (lastladytime> lastmantime) такое же, как (x% m

Дело: Человек оставляет сиденье
Дама никогда не должна двигать сиденье, но ему всегда нужно поднимать его. Следовательно, пол (X / N) .

Человек: Человек оставляет сиденье вверх, n == m
, ему всегда нужно будет поднять его, и ей всегда нужно будет толкать его, кроме как в самом первом использовании туалета, когда у нее нет делать что-либо. Следовательно 2 * Этаж (X / N) - (x

Чехол: Человек оставляет сиденье, n> m
каждый раз, когда он его использует, ему нужно Поднимите это. Ей только нужно только подталкивать его после того, как он использует его. Это происходит все время, кроме как в конце, если время закончится, прежде чем она получает использование туалета после него. Поэтому мы должны минусовать 1, если LastMantime> = lastladytime (помните, на дамах сначала). Следовательно, 2 * этаж (X / N) - (lastmantime> = lastladytytime? 1: 0) = 2 * Этаж (x / n) - (x% n <= x% m? 1: 0)

Корпус: Человек оставляет сиденье вверх, n
, аналогично n> м. Каждый раз, когда она использует это, ей нужно отталкивать его. Ему нужно только поднять его один раз после того, как она использует его. Это происходит все время, кроме как в конце, если время закончится, прежде чем он должен использовать туалет после нее. Поэтому мы должны минус 1, если lastmantime 2 * Этаж (х / м) - (x% n> x% m ? 1: 0) + (x

2
ответ дан 27 November 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: