寻找合适的算法

时间:2012-05-28 09:35:05

标签: java algorithm

我有一个问题要从SPOJ解决 - 就像平台一样,我无法想出如何解决这个问题。这是问题,用G翻译器翻译,但如果丢失了一些东西,我可以尝试更好地翻译它

该条目给出测试次数T(10 <= T <= 100)。对于每个测试,给出数字N(3 <= N <= 100)。该数字是等边N角(例如,等边五边形,对于N = 5),边长为1.在N-gon的N个顶点中的每一个上都是种子蜗牛。每只蜗牛作为“目标”设置了一只蜗牛到达另一只 - 站在相邻顶点的那只(相邻节点选择的方向始终相同的事实,即每只蜗牛“追逐”只是一只螺丝和每只蜗牛都被一只蜗牛“追逐” - 蜗牛的选择只在开始时只做一次,直到追逐结束时才会改变。在一瞬间,蜗牛开始朝着它的目标移动(在任何时候都与它的目标完全一致)。它持续到所有蜗牛在一个点上没有相互接触为止。为了更好地说明这种情况,请查看下图:

Illustrated explanation

箭头显示了所选目标,每只蜗牛的情况。十字表示所有人彼此接触的大致位置。你的任务是确定每只蜗牛的距离(所有蜗牛都会产生完全相同的距离)。如果结果超过两位小数,则绕过第二个小数位。

总结:

  

输入

     

测试次数T

     

在N的下一个T行中

     

输出

对于每个测试,在追逐过程中每个蜗牛的距离(结果四舍五入到小数点后两位)。

示例输入:

  

5

     

3

     

5

     

7

     

9

     

91

输出:

  

0.67

     

1.45

     

2.66

     

4.27

     

419.69

我希望有人向我解释如何从示例输入中获取所需的输出,并提出一些可以使用的算法。

感谢您提前的时间

2 个答案:

答案 0 :(得分:2)

你需要一些物理学。从其中一只蚂蚁的参考框架看它。所以一只蚂蚁总是走向它。现在沿着连接蚂蚁的线的相对速度。这将是v(1-cos(2 * pi)/ N)(解决这个问题。这很容易)

现在,当位移等于边长时,它们相遇。因此,所花费的时间是1 / v(1-cos((2 * pi)/ n))。行进距离为v * t,因此距离为1 /(1-cos((2 * pi)/ N))。

您可以在此处查看直接公式。

http://mathworld.wolfram.com/MiceProblem.html

答案 1 :(得分:1)

你也可以这样看:蜗牛从正多边形的顶点开始,因为它们都以相同的速度向目标移动,它们将始终保持在正多边形的顶点。因此,从中心到蜗牛的射线与蜗牛的运动方向之间的角度是恒定的。这意味着蜗牛的路径是Logarithmic spirals

z(t) = e^{ct}和0之间的对数螺旋|z| = 1部分的长度为|c|/|Re c|

对于给定的情况,c = e^{2π i/N} - 1 = (cos(2π/N) - 1) + i*sin(2π/N)是(最多缩放)螺旋的参数。

现在|c| = 2*sin(π/N)|Re c| = 1 - cos(2π/N) = 2*sin²(π/N),因此如果起点和汇点之间的距离为1,则每只蜗牛都会行驶1/sin(π/N)。但条件是多边形的边是1,而不是中心和顶点之间的距离,所以我们必须缩放。方便的是,如果中心和顶点之间的距离为1,则边长为|c|,因此对于边长1/|Re c| = 1/(1 - cos(2π/N),行进距离的公式简化为1 (1)功能

(¹)当然,这与@ sukun007的结果完全相同,只是来源不同。