题目链接:
题目意思:
在一个周长为10000的圆上等距离分布折n个雕塑,现在又有m个新雕塑加入(位置可以随意放),希望所有n+m个雕塑在圆周上均匀分布,这就需要移动一些原有的雕塑。要求n个雕塑移动的距离和最小。
题目分析:
仔细分析样例,3个样例有一个共同特点,即有一个雕塑没有移动,如果该特点成立,那么其他的雕塑位置已经确立。我们不放设没动的雕塑坐标为0,其他的n+m个雕塑的编号分别为1,2,。。。,再根据此坐标计算出初始的n个雕塑的坐标,例如n=3,m=1时,移动后的雕塑坐标为0,1,2,3;移动前的雕塑坐标为0,4/3,8/3;再计算出坐标向邻近两个坐标中移动;最小距离。注意,此坐标是按10000/(m+n)比列得来的坐标,最后需要转换回去。具体为什么会有一个雕塑不动,参考刘汝佳训练指南P4.
AC代码:
#include <stdio.h>
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m) != EOF)
{
double ans = 0.0;
for(int i=1;i<n;i++)
{
double pos = (double)i/n*(m+n);
ans += fabs(pos - floor(pos + 0.5)) /(m+n);
} //floor为取整函数,得到pos四舍五入后的整数值
printf("%.4lf\n",ans*10000);
}
return 0;
}