题目:在一个周长为10000的圆上等距分布着n个雕塑。现在又有m个新雕塑加入(位置可以随意放),希望所有n+m个雕塑在圆周上均匀分布。这就需要移动其中一些原有的雕塑。要求n个雕塑的移动的总距离尽量小。
题解:
周长为多少先不考虑,先用n+m算,之后再按比例扩大。用n+m算,既新雕塑加入后各个雕塑之间的距离为1,移动后的位置。移动前,选定一个雕塑为原点,那么每个雕塑的坐标就是 i*(n+m)/n 把每个雕塑移动到离它最近的整数坐标的位置,既移动完成后需要有雕塑的位置。
如果没有两个雕塑移动到相同的位置,那么这样的移动是最优的。
那么如何证明,不会存在有两个雕像移动到同一个地方呢。能移动到同一个地方的雕塑坐标距离会小于1,例如1.5与2.4999,它们会移动到2这个位置,但这是不可能的,因为,移动之前位置是等距分配的,而周长(n+m)除以移动之前的个数n,距离是大于1的,所以,不会存在有两个雕像移动到同一个地方。
代码:
#include<cstdio>
#include<cmath>
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
double ans=0.0;
int i;
for(i=1;i<n;i++)
{
double pos=(double)i/n*(n+m);
ans+=fabs(pos-floor(pos+0.5))/(n+m);
}
printf("%.4lf\n",ans*10000);
}
return 0;
}