这是问题--->
输入为2 6 10。 输出应为41。
这是输出的说明:
我的代码给出正确的输出,但是随着数字变大,速度会变慢。我的代码在下面。
def findMinGameCycle(e, n, m_0):
r_total=2**(n-1)*(e+1)
rest=0
cycle=n
m_total=m_0
while m_total<=r_total:
rest+=1
cycle+=rest+1
m_0+=1
m_total+=m_0
return cycle
答案 0 :(得分:1)
科学计算101:首先,尝试对问题进行数学运算。这个问题有一个封闭形式的解决方案,只需要查看模式和二次公式即可。
让var transforms = selectedElement.transform.baseVal;
如上所述。
在第0周期,有e, n, m_0
个敌人。在周期1,有e+1
。在周期2,有2(e+1)
。推断,似乎在4(e+1)
周期(它们停止复制)处,有n-1
个敌人。
在周期n,有2^(n-1)(e+1)
个奴才。在周期m_0
(他必须等待转弯),有n+2
。在周期m_0 + (m_0 + 1)
(他必须等待两转),有n+5
。重新排列,在周期m_0 + (m_0+1) + (m_0+2)
中有n+5
个奴才。在周期3m_0 + (1+2)
上有n+9
个小仆,在周期4m_0 + (1+2+3)
上有n+14
个小仆。外推,在周期5m_0 + (1+2+3+4)
(请参见下面的链接)中,有n+k(k+1)/2-1
个奴才。右边的总和是equal to k(k-1)/2
。
我们想知道小兵何时超过敌人。如果数字是连续的,那么当一个超越另一个时,它们是相等的。
即km_0 + (1+2+3+....(k-1))
这是2^(n-1)(e+1) == km_0 + k(k-1)/2
中的二次方程式(回想k
是固定的,并且已给出)。
使用方便的quadratic formula解决n,m_0,e
,我们得到:
k
请注意,在我们的问题中,k = (1/2-m0) + sqrt((m0-1/2)^2+2^n*(e+1))
不是连续的,因此在这一点上我们必须使其完整。如果k
是一个小数,我们必须四舍五入到下一个整数,因为在下一个整数下,没有足够的仆从。
一旦我们对k
进行四舍五入,就可以使用它来找到周期,该周期由上面的公式k
给出。
这是python中的所有逻辑:
n+k(k+1)/2-1
由于我们花时间做一些数学运算,所以没有循环,并且我们有一个固定的时间解决方案。