Java 以给定的最大x速度通过线段的最大y速度 给定一行线段Si,每个都具有坐标席和Yi(对于每一个I,Yi+1大于Yi),并且每个长度B在x方向上,我如何计算最大Y速度通过所有段,其中可以以最大速度V改变x坐标。(对于某些段序列,这可能是不可能的)
下面是一个示例(段坐标(1,1)、(5,2)、(1,3)和长度3(第二段的图片显示不正确),最大x速度=2):Java 以给定的最大x速度通过线段的最大y速度 给定一行线段Si,每个都具有坐标席和Yi(对于每一个I,Yi+1大于Yi),并且每个长度B在x方向上,我如何计算最大Y速度通过所有段,其中可以以最大速度V改变x坐标。(对于某些段序列,这可能是不可能的),java,algorithm,coordinates,dynamic-programming,Java,Algorithm,Coordinates,Dynamic Programming,下面是一个示例(段坐标(1,1)、(5,2)、(1,3)和长度3(第二段的图片显示不正确),最大x速度=2): 我会首先将线段排序为增加的Y值,并将具有相同Y值的线段分组在一起。我假设,如果有两个具有相同y值的段,则可以通过其中一个。如果情况并非如此,您可能会将其替换为一个单独的线段,该线段是它们的交点,并按此处所述继续进行,或者如果交点为空,则表示不可能 查看任意线段的最左侧和最右侧之间的差值,以及两个不同Y值之间的最小差值,可以计算两个不同Y值之间最小差值中最左侧值和最右侧值之间的速度。这是
我会首先将线段排序为增加的Y值,并将具有相同Y值的线段分组在一起。我假设,如果有两个具有相同y值的段,则可以通过其中一个。如果情况并非如此,您可能会将其替换为一个单独的线段,该线段是它们的交点,并按此处所述继续进行,或者如果交点为空,则表示不可能 查看任意线段的最左侧和最右侧之间的差值,以及两个不同Y值之间的最小差值,可以计算两个不同Y值之间最小差值中最左侧值和最右侧值之间的速度。这是一个可能的速度,所以最小可能的速度在这和0之间 现在猜猜速度。对于此速度,您将计算出每个y值处的一系列间隔,这些间隔是可达到的x值。开始时,所有具有最小y值的线段都是可访问的。现在考虑所有组的分段,以增加Y值的顺序。在给定当前速度的情况下,计算从当前间隔集可以到达的分段组中的哪些间隔。这将成为新的可到达间隔集。解决这一问题的一种方法(不一定是最好的方法)是扩大当前可到达间隔集,方法是在两组分段之间的y距离内,用当前最大速度行驶的距离向左和向右填充它们,然后将此扩大的可到达间隔集与新的分段集相交 现在,您可以对速度进行二元切分(从0到您之前计算的最大速度之间开始),以获得刚连接的段的大致速度。事实上,我认为如果我更聪明的话,我可以描述你如何通过线段,不仅计算区间,而且计算区间上的线性函数,这将允许你精确地解决这个问题。事实上,我认为这告诉我,当速度超过最小必要速度时,最后一个Y值处可到达段的总长度在您选择的速度中是分段线性的
但仅仅知道这一点就可以让你做出比二进制切碎更好的猜测。使用迄今为止工作的最小速度的两次猜测,使用可到达段的长度推断出使问题可到达的速度。如果猜测不起作用,则在重试之前,再进行一次二进制切分,以获得迄今为止有效的新的最小速度。重新表述,我们得到了几个水平线段
[l_i,u_i]×{y_i}
和水平速度v
并希望找到最大垂直速度s
,以便存在x\i∈ [l_i,u_i]
带|y_i-y_{i-1}/s≥ |x_i-x_{i-1}/v
,即水平移动的时间不超过垂直移动的时间。这个问题有这样一个LP公式
minimize z (intuitively, z = v/s)
subject to
l_i ≤ x_i ≤ u_i, for all i
x_i - x_{i-1} ≤ |y_i - y_{i-1}| z, for all i
x_{i-1} - x_i ≤ |y_i - y_{i-1}| z, for all i
variables
x_i, for all i
z
单纯形法可以很快解决这个问题。好的,我明白你的意思,但我无法实现实际的实现。如果能给我一点提示,我将不胜感激。我忘了提一点:s必须至少是1,所有坐标和速度都是整数。