UVA1388
题意:一个周长为10000的圆上均匀分布n个雕塑,现在再插入m个雕塑,希望n+m个雕塑也能在这个圆上均匀分布。可能需要移动原有的一些雕塑。问:n个雕塑最小移动的总距离是多少。
思路:首先需要找到原有的n个雕塑在插入m个雕塑后,它们每个的位置。n个雕塑的移动选一个参考点,这个参考点是不动的。所以可以把它看成数轴上的原点。第i个点的位置就是i/n(未移动时),添加了m个雕塑后,相当于把这个数轴变成了n+m,第i个点的位置就是**(i / n) * (n+m)了(未移动)。添加了m个雕塑后每个点都需要分布在i / (n+m)上**,我们需要做的就是找到这n个点各自最近的i / (n+m)的点,这样移动的距离也就最小了。这当中又涉及到了是否会重复以及是否会有一个点不需要移动。(后两个问题在刘汝佳蓝书上有解答)
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
double n,m;
while(scanf("%lf%lf",&n,&m)!=EOF)
{
double ans=0;//移动的距离总和
for(int i=1;i<n;i++)
{
double pos=(double)i/n*(n+m)//数轴总长度由n扩大到n+m后的坐标,
ans+=fabs(pos-floor(pos+0.5))/(n+m);
//floor为向下取整,floor(pos+0.5)决定了向前,向后,不动
//因为pos=i/n * (n+m),所以floor(pos+0.5)取整,就可以移动到最近的i / (n+m)点上),fabs(...)/(n+m)这里除以(n+m)把数轴缩回1
}
printf("%.4lf\n",ans*10000);
}
return 0;
}
如有错误还请斧正