我试图使我的算法更有效,但由于某些原因,它不能正常工作,谁能告诉我,如果我的逻辑是正确的。一般的问题是,如果你有一个'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,然后下一次跳,你就会越过墙。
发布于 2011-09-20 23:21:47
好的,让我们看看。最后一次跳跃来自x - u或更高的高度。您必须在(u - d)-size步骤中介绍的其余步骤,这些步骤的数量当然是(x - u)/(u - d)。
在i-th步骤之后,你在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是一个数学函数,返回不小于给定数字的最小整数。)
https://stackoverflow.com/questions/7487548
复制相似问题