Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何为跳蛙定位百合花?_Performance_Algorithm_Language Agnostic - Fatal编程技术网

Performance 如何为跳蛙定位百合花?

Performance 如何为跳蛙定位百合花?,performance,algorithm,language-agnostic,Performance,Algorithm,Language Agnostic,我最近一直在练习解决问题的技巧,为高中编程比赛做准备,遇到了一个有趣的问题 2013年,首届国际蛙泳奥林匹克运动会将在澳大利亚举行,你决心获胜。虽然你不想和这些粘乎乎的、神经质的生物有任何关系,但你计划进入一个像青蛙一样的机器人,你知道它将比所有其他有机物进入者都要快 IOF发生在一个大池塘里,池塘里有一排排排成长队的百合花垫。比赛规则很简单:你的青蛙将被放在第一个睡莲垫上,然后它必须跳到第二个睡莲垫上,然后跳到第三个睡莲垫上,依此类推,直到它到达球场上的最后一个睡莲垫。请注意,您不能“跳过”睡

我最近一直在练习解决问题的技巧,为高中编程比赛做准备,遇到了一个有趣的问题

2013年,首届国际蛙泳奥林匹克运动会将在澳大利亚举行,你决心获胜。虽然你不想和这些粘乎乎的、神经质的生物有任何关系,但你计划进入一个像青蛙一样的机器人,你知道它将比所有其他有机物进入者都要快

IOF发生在一个大池塘里,池塘里有一排排排成长队的百合花垫。比赛规则很简单:你的青蛙将被放在第一个睡莲垫上,然后它必须跳到第二个睡莲垫上,然后跳到第三个睡莲垫上,依此类推,直到它到达球场上的最后一个睡莲垫。请注意,您不能“跳过”睡莲垫——每个睡莲垫必须跳上一次。第一只到达最后一朵百合花的青蛙将赢得比赛。由于你的机器青蛙拥有超青蛙速度,你对自己的胜利充满信心

然而,你的青蛙有一个小的不可纠正的缺陷——它只能跳一个固定的距离。具体来说,它只能从当前位置向前跳K米,即使这会使青蛙落在水中(它会在水中迅速短路)

由于最初的睡莲垫位置可能使你的青蛙无法到达最后一个睡莲垫,因此你计划分散注意力,移动睡莲垫,使它们的间距正好为K米,使你的青蛙能够从第一个跳到最后一个,而不会掉进水里。将睡莲垫移动一米需要一秒钟的时间,而且你偷偷移动睡莲垫的时间越长,IOF评委就越有可能注意到你并取消你的参赛资格

考虑到课程中睡莲垫之间的初始距离,您必须编写一个程序来计算移动睡莲垫所需的最短时间,以便所有连续睡莲垫对之间的距离正好为K米。您可以假设池塘足够长,因此第一个百合花垫可以向后移动任意距离,最后一个百合花垫可以向前移动任意距离

输入和输出示例


我已经考虑了这么长时间,但考虑到时间的限制,我仍然想不出任何方法来完成它,甚至无视这一点。任何关于如何处理此问题的建议或任何关于研究算法/概念的建议都将不胜感激。提前谢谢你的帮助


欢迎使用任何代码,最好使用c/c++、python、Java或c#。谢谢

一般来说,您可以考虑解决建模和设计/实现方面的问题

  • 用自己的话重述问题。在科学或数学环境中,您可能会使用数学符号,以使定义精确和简洁
  • 定义可能的操作。这类似于典型的计算机科学方法,在这种方法中,您可以定义对抽象数据类型可能进行的操作,或者定义可以进出系统的事件
  • 基于1和2,设计一个算法
  • 测试并在必要时返回步骤3,或者如果在问题陈述或操作中发现错误,甚至返回步骤1或步骤2,或者重新陈述问题和定义操作的方法,以使事情更易于实施
  • 建模对应于第1和第2阶段,设计/实施对应于第3和第4阶段

    由于这是一个高中竞赛的练习题,您已经询问了如何解决,我将尝试1和2,并为3提供一些提示。我将把第4步留给你们:我发现很难在没有错误的情况下完成第1步和第2步,因此,尽管可能会有一些错误,但我希望下面的内容仍然有助于说明如何继续进行

    1个问题陈述

    您有
    n
    个圆圈,可以向前跳转距离
    x
    (其值在输入文件中定义)

    • n
      圆圈由编号
      0
      (n-1)

    • d[i],1≤ 我≤ n-1是圆
      (i-1)
      和圆
      i
      之间的距离。(其初始值在输入文件中定义)

    目标是:对于所有
    i
    d[i]=x
    ,使用最小的圆移动次数,每次移动将一个圆向左或向右移动
    1

    2种可能的操作

    第一圈和最后一圈

    • 移动第一个圆圈,将圆圈
      0
      向左移动
      y
      空格:
      d[1]=d[1]+y

    • 将第一个圆向右移动
      0
      y
      空格:
      d[1]=d[1]-y

    • 移动最后一个圆圈,将圆圈
      n-1
      向左移动
      y
      空格:
      d[n-1]=d[n-1]-y

    • 移动最后一个圆圈,将
      n-1
      圆圈向右移动
      y
      空格:
      d[n-1]=d[n-1]+y

    对于任何中间圆
    i
    1≤ 我≤ n-1

    • 将圆
      i
      向左移动
      y
      空格:
      d[i]=d[i]-y
      d[i+1]=d[i+1]+y

    • 将圆
      i
      向右移动
      y
      空格:
      d[i]=d[i]+y
      d[i+1]=d[i+1]-y

    概括

    • 对于第一个和最后一个距离,您可以添加/减去任何数字
      y
    • 对于中间的距离,你可以添加/减去任何数字<代码> y>代码>但是你必须通过从相邻的距离减去/添加<代码> y <代码>来平衡这一点。
    3设计算法new_left_sum = left_sum + left_count + array[current_zero_index] new_left_count = left_count + array[current_zero_index] new_right_sum = right_sum - right_count new_right_count = right_count - array[current_zero_index] current_zero_index = current_zero_index + 1