《Python—每日一道算法题》基地雕塑(Graveyard,NEERC 2006,LA3708)

在一个周长为10000的圆上等距分布着n个雕塑。现在又有m个新雕塑加入(位置可随意放),希望所有n+m个雕塑在圆周上均匀分布。这就需要移动一些原有的雕塑。要求n个雕塑移动的总距离尽量小。

Sample Input

sample input #1
2 1

sample input #2
2 3

sample input #3
3 1

sample input #4
10 10

Sample Output

sample output #1
1666.6667

sample output #2
1000.0

sample output #3
1666.6667

sample output #4
0.0

分析:

周长为多少先不考虑,先用n+m算,之后再按比例扩大。用n+m算,既新雕塑加入后各个雕塑之间的距离为1,移动后的位置。移动前,选定一个雕塑为原点,那么每个雕塑的坐标就是 i*(n+m)/n 把每个雕塑移动到离它最近的整数坐标的位置,既移动完成后需要有雕塑的位置。

如果没有两个雕塑移动到相同的位置,那么这样的移动是最优的。

那么如何证明,不会存在有两个雕像移动到同一个地方呢。能移动到同一个地方的雕塑坐标距离会小于1,例如1.5与2.4999,它们会移动到2这个位置,但这是不可能的,因为,移动之前位置是等距分配的,而周长(n+m)除以移动之前的个数n,距离是大于1的,所以,不会存在有两个雕像移动到同一个地方。

Python代码:

import math
#n表示原始的雕塑数量;m表示新加入的雕塑数量
n,m=map(int,input().split())
ans=0
for i in range(1,n):
    pos=i/n*(n+m) #计算每个需要移动的雕塑的坐标
    #坐标为pos的雕塑移动到的目标位置是floor(pos+0.5) ,就是pos四舍五入的结果
    ans+=math.fabs(pos-math.floor(pos+0.5))/(n+m) #累加移动距离
print(round(ans*10000,4))

运行结果:

猜你喜欢

转载自blog.csdn.net/qq_41251963/article/details/109963292