Description
有一组点均匀地分布在在一个周长为10000米的圆上。现在要再添加一些点进去,使得这些点仍均匀分布。如果仅可以沿圆周移动某些点,请你求总移动距离的最小值。
Input
有多行输入,每行两个数字n,m(2<=n<=1000,1<=m<=1000),空格隔开,分别表示原先和要添加的点的数量,当输入0 0
时,表示输入结束,程序退出。
Output
总移动距离的最小值,保留4位小数。 其余要求同首题 。
Sample Input
2 1
2 3
0 0
Sample Output
1666.6667
1000.0000
Reference code
[ n1, n2] = list ( map ( int , input ( ) . split( ' ' ) ) )
while n1 and n2:
print ( '%.4f' % sum ( abs ( i* 10000 / n1- ( i+ int ( i* n2/ n1+ 0.5 ) ) * 10000 / ( n1+ n2) ) for i in range ( n1) ) )
[ n1, n2] = list ( map ( int , input ( ) . split( ' ' ) ) )
'''
while True:
[n1,n2]=list(map(int,input().split(' ')))
if n1==0 and n2==0:
break
ans=0
x=[i*10000/n1 for i in range(n1)]
y=[i*10000/(n1+n2) for i in range(n1+n2)]
for i in range(n1):
for j in range(n1+n2):
if y[j]<=x[i]<=y[j+1]:
ans+=min(x[i]-y[j],y[j+1]-x[i])
print('%.4f'%ans)
'''
Algorithm Explain
这是一条略有难度的题目,其中的算法在数学上证明需要一点功夫。笔者在这里贴一下自己的解法: 我们将这个圆以其中一点为原点展开成一条线段,线段的左端点放点,右端点不放点。 用
x
i
x_i
x i 表示原来各点的坐标,有
x
i
=
l
i
n
1
,
0
⩽
i
⩽
n
1
,
i
∈
Z
,
l
=
10000
x_i=l \frac{i}{n_1} , 0 \leqslant i \leqslant n_1 , i \in \mathbb{Z} ,l=10000
x i = l n 1 i , 0 ⩽ i ⩽ n 1 , i ∈ Z , l = 1 0 0 0 0
用
y
j
y_j
y j 表示之后各点的坐标,有
y
j
=
l
j
n
1
+
n
2
,
0
⩽
j
⩽
n
1
+
n
2
,
j
∈
Z
y_j=l \frac{j}{n_1+n_2} , 0 \leqslant j \leqslant n_1+n_2 , j \in \mathbb{Z}
y j = l n 1 + n 2 j , 0 ⩽ j ⩽ n 1 + n 2 , j ∈ Z
则有
x
i
−
y
j
=
l
(
i
n
1
−
j
n
1
+
n
2
)
x_i - y_j=l \left(\frac{i}{n_1}-\frac{j}{n_1+n_2} \right)
x i − y j = l ( n 1 i − n 1 + n 2 j )
要使每一个
i
i
i 的
∣
x
i
−
y
j
∣
\vert x_i-y_j \vert
∣ x i − y j ∣ 最小,则
j
j
j 一定满足以下两种情况之一:
{
x
i
−
y
j
⩾
0
x
i
−
y
j
+
1
⩽
0
①
\left\{ \begin{aligned} x_i - y_j \geqslant 0 \\ x_i - y_{j+1} \leqslant 0 \end{aligned} \right. ①
{ x i − y j ⩾ 0 x i − y j + 1 ⩽ 0 ①
{
x
i
−
y
j
−
1
⩾
0
x
i
−
y
j
⩽
0
②
\left\{ \begin{aligned} x_i - y_{j-1} \geqslant 0 \\ x_i - y_{j} \leqslant 0 \end{aligned} \right. ②
{ x i − y j − 1 ⩾ 0 x i − y j ⩽ 0 ②
解①得:
j
=
i
+
[
n
2
n
1
i
]
j=i+\left[ \frac{n_2}{n_1}i \right]
j = i + [ n 1 n 2 i ]
解②得:
j
=
i
+
[
n
2
n
1
i
]
+
1
j=i+\left[ \frac{n_2}{n_1}i \right] +1
j = i + [ n 1 n 2 i ] + 1
当
x
i
−
y
j
⩽
y
j
+
1
−
x
i
x_i - y_{j} \leqslant y_{j+1} - x_i
x i − y j ⩽ y j + 1 − x i 时取①,否则取②,此时有:
{
n
2
n
1
i
}
⩽
1
2
\left\{ \frac{n_2}{n_1}i \right\}\leqslant \frac{1}{2}
{ n 1 n 2 i } ⩽ 2 1
则可以得出,对于每一个
i
i
i ,其对应的
j
j
j 为:
j
=
i
+
[
n
2
n
1
i
]
+
[
{
n
2
n
1
i
}
+
1
2
]
=
i
+
[
n
2
n
1
i
+
1
2
]
j =i+\left[ \frac{n_2}{n_1}i \right]+\left[\left\{ \frac{n_2}{n_1}i \right\} + \frac{1}{2}\right] \\ =i+\left[\frac{n_2}{n_1}i+\frac{1}{2}\right]
j = i + [ n 1 n 2 i ] + [ { n 1 n 2 i } + 2 1 ] = i + [ n 1 n 2 i + 2 1 ]
但是,此题到这里还并没有结束,仔细思考后我们会发现,如果存在一种情况下,
x
i
x_i
x i 移向
y
j
y_j
y j ,
x
i
+
1
x_{i+1}
x i + 1 也移向
y
j
y_j
y j ,这会导致两个点重合而存在空缺的点位,最终的总距离偏小。 那么,这种情况是否会存在呢?假设存在这种情况,则有
{
y
j
+
1
−
x
i
⩾
x
i
−
y
j
x
i
+
1
−
y
j
+
1
⩾
y
j
+
2
−
x
i
+
1
\left\{ \begin{aligned} y_{j+1} - x_i \geqslant& x_i - y_{j} \\ x_{i+1} - y_{j+1} \geqslant& y_{j+2} - x_{i+1} \end{aligned} \right.
{ y j + 1 − x i ⩾ x i + 1 − y j + 1 ⩾ x i − y j y j + 2 − x i + 1
上下相加得:
2
(
x
i
+
1
−
x
i
)
<
y
j
+
2
−
y
j
2\left(x_{i+1} - x_i\right) <y_{j+2}-y_j
2 ( x i + 1 − x i ) < y j + 2 − y j
即
l
n
1
<
l
n
1
+
n
2
\frac{l}{n_1}<\frac{l}{n_1+n_2}
n 1 l < n 1 + n 2 l
即
n
2
<
0
n_2<0
n 2 < 0 ,矛盾!!! 所以这种情况不存在。此题至此结束。