2011-09-25 83 views
5

在白天,一只蜗牛爬上了墙壁。经过一整天的劳动,它停下来休息了一段时间......但睡着了!第二天早上醒来,发现它在睡觉时滑下了。为我的作业优化的解决方案

如果每天都发生这种情况,蜗牛会爬上多少次以覆盖不同高度的n个墙壁?

我写了一个函数来计算蜗牛的野怪的数量,如下图所示:

void count(int move_forward, int move_backward, int number_walls, int[] height) 
    { 
     int count = number_walls, diff = move_forward - move_backward; 
     while (number_walls--) 
      for (move_backward = move_forward; move_backward < height[number_walls]; move_backward += diff) 
       count++; 
    } 

它的正常工作。但我想知道是否有任何其他解决此问题的方法来进一步优化程序的速度。

+3

(height-x)/(x-y)+1,不需要循环 – amit

+2

@Jay,BTW - 在早期问题中使用有意义的变量名称的建议在内部循环的上下文中是有争议的。太多太长的名称会让你的代码像一堆神秘的单名和双名字一样无法读取。这完全取决于平衡。 – dmckee

+1

只要我坚持我的鼻子,还有一点意见。这个练习的要点可能是向你展示一下,坐下来想一会儿,你可以从“O(高度)”(方法你尝试它)到'O(1)'(amit解决它的方式)。 – dmckee

回答

7

解决方案是((height-x)/(x-y))+1,不需要循环。

蜗牛需要爬到:height-x,需要他((height-x)/(x-y))天。一旦它在那里,他需要额外的一天才能爬上剩余的x。

编辑:在评论中提到,这种解决方案解决了每面墙的问题,您需要遍历您heights阵列,并且总结了这些结果,您节省至少内部循环,使IT运(n),而不是O(n * h),其中n是墙的数量,h是墙的高度。

(*)注意:您可能希望保存每个墙的提醒[即在他穿过这堵墙之后蜗牛可以继续走下去多少],并从下一堵墙中扣除它,依赖于任务描述......如果蜗牛每天最多可以通过一面墙,则忽略最后一条评论。

+0

下垂者会详细说明吗? – amit

+2

我不是downvoter,但我想这是因为height是一组值。您仍然需要一个循环来获取总高度或将解决方案应用于每个高度。 – tinman

+0

@tinman:你说得对,这个答案显示了如何做一个单一的墙,我会明确提到它。感谢您的评论。 – amit