2011-09-20 68 views
0

我想让我的算法更高效,但由于某种原因,它不能正常工作,有人会告诉我,如果我的逻辑是正确的。一般的问题是,如果你有一个'x'的高度,并且你可以跳过'u'距离,但是如果你还没有清除高度,你就会掉下'd'距离。我必须计算跳跃的次数。效率问题

初始代码正常

while(x-u>0) { 
    x=x-u+d; 
    i++; 
} 
i++; 

更高效的代码(由于某种原因失败某些情况下,我不知道是哪个案件虽然)

​​

让我尝试和澄清你的问题有一个高度为X的墙,你可以跳到U的距离,但是每次跳时你也会滑下D的距离D. 所以我们可以说如果你有一个高度为x = 4,u = 4,d = 1的墙。那么你只需要跳一次,因为第一次跳你就已经清除了墙,所以你根本不会滑倒。现在让我们说x = 6,u = 4,d = 1。然后你必须跳两次,因为你第一次跳到4,但是下降到1,所以你在3,然后下一次你跳墙。

+2

不知道,基于在你发布的内容上。无法分辨x,u,z,d,i或k是什么。通过调试器的小程序会告诉你。 – duffymo

+0

whats k?和z?你能再解释一下吗?为什么你需要d? – SD1990

+0

不知道我明白为什么你有这个下降的方面,但无论如何,它听起来像你应该以代数方式写下这个问题,然后象征性地解决它,然后作为一段代码实现。 – Marcin

回答

4

好的,让我们来看看。 最后跳跃来自x - u或更高的高度。其余的你必须在(u - d)大小的步骤中覆盖,这些步骤的数量当然是(x - u)/(u - d)

经过i第012步,你在高度i * (u - d) + u(并跌倒)。所以,在约。 (x - u)/(u - d)步骤你在高度x - u + u = x。回顾步数应该是一个整数,我们得到的最终结果:

if (u >= x) 
    return 1; 
if (u <= d) 
    throw "Impossible"; 
return ceil((x - u)/(u - d)); 

ceil是一个数学函数返回的最小整数不小于给定数。)