我正在努力提高我的算法的效率,但由于某种原因它不能正常工作,有人可以告诉我我的逻辑是否正确。一般的问题是,如果你的高度为“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/