java - 效率问题

标签 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 点,然后下一次跳跃你会越过墙。

最佳答案

好吧,让我们看看。 最后 跳跃来自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 是一个返回不小于给定数的最小整数的数学函数。)

关于java - 效率问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7487548/

相关文章:

java - 错误 : Warnings found during shrinking, 请使用 -dontwarn 或 -ignorewarnings 来抑制它们

java - 如何查看时间是否在纽约时间下午 2 点到凌晨 1 点之间?

algorithm - 从文件中排序名称的有效方法?

algorithm - 递归查询邻接表以在 SQL 中预先排序树遍历?

python - Python中有没有办法计算多条曲线之间的重叠面积?

java - 为什么 TreeSet 在添加新元素之前不比较所有元素?

java - 从依赖于另一个 jar 的 jar 加载类

c++ - DFID(深度优先迭代深化)与 IDA*(迭代深化 A*)

c++ - Python 和/或 C/C++ 中的高精度算术?

java - 以贪婪的方式分配给定的数字