Давайте возьмем некоторый обычный дом с человеком, который должен перейти к туалету каждый n
минуты, требуя, чтобы место произошло, и женщина, которая должна сделать это каждый m
минуты, требуя, чтобы место снизилось. Есть ли возможность создать a O(1)
алгоритм, который произведет точное количество перемещений сиденья унитаза за установленный срок X
минуты? Существует два различных дополнительных исходных данных:
1. Человек всегда оставляет на виду место после посещения.
2. Человек всегда подавляет место после посещения.
Заключение: в реальной жизни (который включает n
будучи намного больше, чем m
, с X-> бесконечность), доказано, что нет никакого различия во многих перемещениях места.
Но если человек будет делать это чаще, то женщина, это продлит жизнь места, если он просто оставит на виду место, но является этим случаем, один из них (или оба) должен, вероятно, обратиться к врачу.
Теперь я знаю то, что является лучшим для самого места, но какой человек делает больше перемещений - другой вопрос (который нельзя спросить так или иначе).
для 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)
. Или что-то типа того.
Если все минутные переменные являются целыми числами, то вы могли бы сделать это так:
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;
Я начинаю с предположения, что оба человека начинают "тикать" при t=0. Я считаю, что решение должно быть обобщено на разные стартовые времена, но нетрудно перейти от одного "свободного конца" временной шкалы к двум концам.
Тогда наша временная шкала выглядит так ("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)
Роли женщины и мужчины меняются на противоположные... полуоткрытый интервал.
[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)
Да, по крайней мере, когда реализация может предположить, что цикл для человека и женщины известен заранее, и что он не изменяется:
Начните с наименее распространенных Несколько времен цикла человека / женщины ( LCM
). Закалить движения в течение этого периода времени ( lcm_movements
). Теперь вам нужно только иметь дело с вашим входом
Modulo LCM
. Для этого вы можете просто настроить таблицу фиксированной длины, содержащую количество движений на каждую минуту.
Учитывая время время
и LCM
целых чисел в Java / C / C ++ / C # Фактический расчет может быть это:
return ( time / lcm ) * lcm_movements + movements[ time % lcm ];
Допущения:
Пусть lastladytime: = пол (x / m) * m и lastmantime: = пол (x / n) * n. Они представляют собой последнее время использования туалета. Выражение (lastladytime> lastmantime) такое же, как (x% m Дело: Человек оставляет сиденье Человек: Человек оставляет сиденье вверх, n == m Чехол: Человек оставляет сиденье, n> m Корпус: Человек оставляет сиденье вверх, n
Дама никогда не должна двигать сиденье, но ему всегда нужно поднимать его. Следовательно, пол (X / N)
.
, ему всегда нужно будет поднять его, и ей всегда нужно будет толкать его, кроме как в самом первом использовании туалета, когда у нее нет делать что-либо. Следовательно 2 * Этаж (X / N) - (x
каждый раз, когда он его использует, ему нужно Поднимите это. Ей только нужно только подталкивать его после того, как он использует его. Это происходит все время, кроме как в конце, если время закончится, прежде чем она получает использование туалета после него. Поэтому мы должны минусовать 1, если LastMantime> = lastladytime (помните, на дамах сначала). Следовательно, 2 * этаж (X / N) - (lastmantime> = lastladytytime? 1: 0) = 2 * Этаж (x / n) - (x% n <= x% m? 1: 0)
, аналогично n> м. Каждый раз, когда она использует это, ей нужно отталкивать его. Ему нужно только поднять его один раз после того, как она использует его. Это происходит все время, кроме как в конце, если время закончится, прежде чем он должен использовать туалет после нее. Поэтому мы должны минус 1, если lastmantime