效率问题

时间:2011-09-20 15:15:45

标签: java algorithm math

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

初始代码正常运行

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

效率更高的代码(出于某种原因,在某些情况下会失败,但我不知道哪些情况)

int k=u-d;
if(x-u<=0){
    i++;
} else {
    int z=x/k;
    if (x-((z-1)*k)-u <= 0) {
        i+=z;
    } else {
        i=i+z+1;
    }
}

让我试着澄清一下你有一个高度为X的墙的问题,你可以跳远距离U但是每次跳你也会滑落距离D. 所以,如果你有一个高度为x = 4的墙,u = 4,d = 1。然后你只需要跳一次,因为你第一次跳,你已经清理了墙,所以你根本不会滑倒。现在假设x = 6,u = 4,d = 1。然后你必须跳两次,因为你第一次跳到4但是掉到1所以你是3然后下一次跳跃你清除了墙。

1 个答案:

答案 0 :(得分:4)

好的,让我们看看。 最后跳转来自x - u或更高的高度。您必须在(u - d) - 尺寸步骤中介绍其余部分,此类步骤的数量当然是(x - u)/(u - d)

i步之后,你处于高度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

({{1}}是一个数学函数,返回不小于给定数字的最小整数。)