Algorithm 马桶座圈算法
让我们找一个普通的房子,一个男人每Algorithm 马桶座圈算法,algorithm,language-agnostic,Algorithm,Language Agnostic,让我们找一个普通的房子,一个男人每n分钟上一次厕所,要求把座位放上去;另一个女人每m分钟上一次厕所,要求把座位放下来。是否有可能创建一个O(1)算法,该算法将在给定的X分钟内输出马桶座圈移动的准确次数?有两种不同的附加输入: 1.拜访后,这位男士总是把座位抬高。 2.那人每次来访后总是把座位放下 结论:在现实生活中(包括n远大于m,X->无穷大),已证明座椅运动的数量没有差异。 但是,如果一个男人比一个女人更经常这样做,那么如果他只是让座椅向上,那么会延长座椅的使用寿命,但在这种情况下,他们中的
n
分钟上一次厕所,要求把座位放上去;另一个女人每m
分钟上一次厕所,要求把座位放下来。是否有可能创建一个O(1)
算法,该算法将在给定的X
分钟内输出马桶座圈移动的准确次数?有两种不同的附加输入:1.拜访后,这位男士总是把座位抬高。
2.那人每次来访后总是把座位放下 结论:在现实生活中(包括
n
远大于m
,X->无穷大),已证明座椅运动的数量没有差异。
但是,如果一个男人比一个女人更经常这样做,那么如果他只是让座椅向上,那么会延长座椅的使用寿命,但在这种情况下,他们中的一个(或两个)可能应该去看医生。
现在我知道什么对座椅本身最有利,但哪个人做更多的运动是另一个问题(无论如何都不应该问)。是的,至少在实施过程中可以假设男性和女性的周期是预先知道的,并且不会改变时是这样的: 从最小公倍数的男性/女性循环时间开始(
lcm
)。预先计算此时间段的移动(lcm\u移动
)。现在,您只需处理输入时间
模lcm
。为此,您可以简单地设置一个固定长度的表,其中包含每分钟的移动次数
假设time
和lcm
是Java/C/C++/C中的整数,实际计算可能是:
return ( time / lcm ) * lcm_movements + movements[ time % lcm ];
如果所有分钟变量都是整数,则可以这样做:
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;
int马桶座圈动作=0;
bool seat_up=错误;
对于(i=0;i对于2
,答案是2*floor(X/n)
。男人总是带着马桶座圈去卫生间,然后把它放下。女人永远不会把它放下,因为只有当男人去卫生间时,它才会升起
1
有点棘手
编辑:嗯。对于1
,答案是2*层(X/m)
。马桶座只有在女士去卫生间时才会转换
EDIT2:加上或减去马桶的初始状态
EDIT3:我对1的回答只有在m>=n
时才正确。其余的我稍后会计算出来
编辑4:如果n>=2m
,那么它就是2*层(X/n)
,因为只有当男人小便时,座位才会转换。如果n>m
,我相信答案也是2*层(X/n)
,但我需要算出数学
EDIT5:因此,对于2m>n>m
,当男人在女人后面撒尿时,座位会发生变化,反之亦然。男人/女人的访问顺序每隔最小公倍数(m,n)重复一次
分钟,所以我们只需要关心在这段时间内发生的事情。当男人使用座位时,座位不会转换的唯一时间是如果他连续两次访问它。考虑到女人访问的次数比男人多,每个男人访问之间至少有一个wo男士来访(开始或结束时两次)
答案1变成:(n>m2*floor(X/n):2*floor(X/m))+(余数(X/n)>余数(X/m)?1:0)
。或者类似的东西。是的,有一个基本的O(1)算法。
我从假设两个人在t=0时开始“滴答”开始。
我相信解决方案应该推广到不同的开始时间,但从时间线的一个“自由端”扩展到两端并不困难
假设n假设:
- 我们从t=0开始,把马桶座放下
- 如果男人和女人同时到达,那么女士优先。
让lastLadyTime:=floor(X/m)*m和lastManTime:=floor(X/n)*n。它们表示最后一次使用厕所的时间。表达式(lastLadyTime>lastManTime)与(X%m
案例:男子放下座位
这位女士从来不需要移动座位,但他总是需要把它抬起来。因此地板(X/n)
案例:男子离开座位,n==m
他总是需要把它抬起来,她总是需要把它推下去,除非她第一次上厕所时什么都不用做。因此2*层(X/n)-(X
案例:男子离开座位,n>m
每次他使用它时,他都需要把它举起来。在他使用它之后,她只需要把它往下推一次。这种情况一直都会发生,除非在她跟在他后面上厕所之前时间用完了。因此,如果lastManTime>=LastLadTime(记住,女士优先),我们必须减去1。因此2*floor(X/n)-(lastManTime>=LastLadTime?1:0)=2*楼层(X/n)-(X%n m.每次她用它时,她都需要把它往下推。在她用过它之后,他只需要把它抬起来一次。这种情况一直都会发生,除非在最后,如果时间用完了,他就必须跟着她上厕所。因此,如果lastManTime2*floor(X/m)-(X%n>X%m?1:0)+(X
这是非常简单和明显的解决方案,但没有给出O(1),因为这取决于输入的分钟数。这不是O(1)。它是O(n)其中n==分钟。嗯,我明白了。现在我正试图理解x4u的解决方案……我现在明白了这怎么会成为一个非常有趣的问题。你忘了补充说,这个男人每y
分钟喝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?
total_moves = floor(t/m) * 2 + (t%m < t%n ? 1 : 0)
total_moves = floor(t/n) * 2 - 1 + (t%m >= t%n ? 1 : 0)