在一个周长为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))
运行结果: