计算问题的最佳解决方案

时间:2019-01-31 14:49:42

标签: python

这是问题--->

输入为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

1 个答案:

答案 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

由于我们花时间做一些数学运算,所以没有循环,并且我们有一个固定的时间解决方案。

相关问题