我正在尝试使我的算法更有效但由于某种原因它无法正常工作,有人可以告诉我,如果我的逻辑是正确的。一般的问题是,如果你有一个'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然后下一次跳跃你清除了墙。
答案 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}}是一个数学函数,返回不小于给定数字的最小整数。)