Algorithm 循环马拉松(JBOI 2013)

Algorithm 循环马拉松(JBOI 2013),algorithm,Algorithm,我发现这个问题叫做循环马拉松:来自2013年的JBOI 我已经试着解决了一段时间,但没有运气。。。你介意指导我找到解决办法吗 谢谢一种可能是将当前跑步者存储在一个双链接列表中(以便在他们被淘汰后很容易删除他们) 对于第一个运行程序快于第二个运行程序的每一对连续运行程序,计算它们相遇的时间,并将此时间存储在堆数据结构中(堆包含会面时间和指向第二个运行程序的指针) 堆将允许您找到下一个要会面的运行程序(这将是堆顶部的一对),然后您可以在时间O(logn)中更新数据结构并重复,直到堆为空 更新将需要:

我发现这个问题叫做循环马拉松:来自2013年的JBOI

我已经试着解决了一段时间,但没有运气。。。你介意指导我找到解决办法吗


谢谢

一种可能是将当前跑步者存储在一个双链接列表中(以便在他们被淘汰后很容易删除他们)

对于第一个运行程序快于第二个运行程序的每一对连续运行程序,计算它们相遇的时间,并将此时间存储在堆数据结构中(堆包含会面时间和指向第二个运行程序的指针)

堆将允许您找到下一个要会面的运行程序(这将是堆顶部的一对),然后您可以在时间O(logn)中更新数据结构并重复,直到堆为空

更新将需要:

  • 标志着第二名选手不再参加比赛
  • 从链接列表中删除第二个跑步者
  • 将新的会议时间从第一个跑步者添加到列表中的下一个跑步者(仅当第一个跑步者足够快时)
  • 重新平衡堆
  • 如果此会议中的第一名参赛者已从比赛中删除,则应跳过更新


    总的来说,这需要时间O(nlogn)。

    一种可能是将当前跑步者存储在一个双链接列表中(以便在消除跑步者后轻松删除他们)

    对于第一个运行程序快于第二个运行程序的每一对连续运行程序,计算它们相遇的时间,并将此时间存储在堆数据结构中(堆包含会面时间和指向第二个运行程序的指针)

    堆将允许您找到下一个要会面的运行程序(这将是堆顶部的一对),然后您可以在时间O(logn)中更新数据结构并重复,直到堆为空

    更新将需要:

  • 标志着第二名选手不再参加比赛
  • 从链接列表中删除第二个跑步者
  • 将新的会议时间从第一个跑步者添加到列表中的下一个跑步者(仅当第一个跑步者足够快时)
  • 重新平衡堆
  • 如果此会议中的第一名参赛者已从比赛中删除,则应跳过更新


    总的来说,这需要时间O(nlogn)。

    一种可能是将当前跑步者存储在一个双链接列表中(以便在消除跑步者后轻松删除他们)

    对于第一个运行程序快于第二个运行程序的每一对连续运行程序,计算它们相遇的时间,并将此时间存储在堆数据结构中(堆包含会面时间和指向第二个运行程序的指针)

    堆将允许您找到下一个要会面的运行程序(这将是堆顶部的一对),然后您可以在时间O(logn)中更新数据结构并重复,直到堆为空

    更新将需要:

  • 标志着第二名选手不再参加比赛
  • 从链接列表中删除第二个跑步者
  • 将新的会议时间从第一个跑步者添加到列表中的下一个跑步者(仅当第一个跑步者足够快时)
  • 重新平衡堆
  • 如果此会议中的第一名参赛者已从比赛中删除,则应跳过更新


    总的来说,这需要时间O(nlogn)。

    一种可能是将当前跑步者存储在一个双链接列表中(以便在消除跑步者后轻松删除他们)

    对于第一个运行程序快于第二个运行程序的每一对连续运行程序,计算它们相遇的时间,并将此时间存储在堆数据结构中(堆包含会面时间和指向第二个运行程序的指针)

    堆将允许您找到下一个要会面的运行程序(这将是堆顶部的一对),然后您可以在时间O(logn)中更新数据结构并重复,直到堆为空

    更新将需要:

  • 标志着第二名选手不再参加比赛
  • 从链接列表中删除第二个跑步者
  • 将新的会议时间从第一个跑步者添加到列表中的下一个跑步者(仅当第一个跑步者足够快时)
  • 重新平衡堆
  • 如果此会议中的第一名参赛者已从比赛中删除,则应跳过更新



    总的来说,这需要时间O(nlogn)。

    可视化问题,我在想比较所有跑步者的距离是否有帮助……编辑你的问题,并添加你迄今为止尝试过的所有内容,以获得更高的答案。可视化问题,我在想,像比较所有跑步者的距离这样的东西是否会有帮助……编辑你的问题,并添加你迄今为止尝试过的所有东西,以获得更高的答案。将问题形象化,我在想,像比较所有跑步者的距离这样的东西是否会有帮助……编辑你的问题,并添加你迄今为止尝试过的所有东西,以获得更高的答案。将问题形象化,我在想,比较所有跑步者的距离是否会有所帮助……编辑你的问题,并添加你迄今为止尝试过的所有内容,以获得更高的答案。是的,这与我的想法有点接近……我刚刚意识到,当一个跑步者不连续时,他无法消除另一个,在这个过程中,他必须会见更多的跑步者。所以,我们只需要找出两个连续跑步者相遇的时间。而且。。。我可以假设使用优先级队列而不是堆是尽可能的,对吗?@user2455103堆是一种优先级队列,当然,如果您愿意,您可以自由使用不同类型的优先级队列。非常感谢您的回答!是的,有点