Python “最短”挑战(12.22)

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 = 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

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}

则有
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)

要使每一个 i i x i y j \vert x_i-y_j \vert 最小,则 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 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. ②

解①得:
j = i + [ n 2 n 1 i ] j=i+\left[ \frac{n_2}{n_1}i \right]

解②得:
j = i + [ n 2 n 1 i ] + 1 j=i+\left[ \frac{n_2}{n_1}i \right] +1

x i y j y j + 1 x i x_i - y_{j} \leqslant y_{j+1} - x_i 时取①,否则取②,此时有:
{ n 2 n 1 i } 1 2 \left\{ \frac{n_2}{n_1}i \right\}\leqslant \frac{1}{2}

则可以得出,对于每一个 i i ,其对应的 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]

但是,此题到这里还并没有结束,仔细思考后我们会发现,如果存在一种情况下, x i x_i 移向 y j y_j x i + 1 x_{i+1} 也移向 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&amp; x_i - y_{j} \\ x_{i+1} - y_{j+1} \geqslant&amp; y_{j+2} - x_{i+1} \end{aligned} \right.

上下相加得:
2 ( x i + 1 x i ) &lt; y j + 2 y j 2\left(x_{i+1} - x_i\right) &lt;y_{j+2}-y_j


l n 1 &lt; l n 1 + n 2 \frac{l}{n_1}&lt;\frac{l}{n_1+n_2}

n 2 &lt; 0 n_2&lt;0 ,矛盾!!!
所以这种情况不存在。此题至此结束。

猜你喜欢

转载自blog.csdn.net/qq_43549984/article/details/85218280
今日推荐