题目链接:点击打开链接
题目大意:在一个周长为10000的圆上等距离分布着n个雕塑,现在又有m个新雕塑加入,希望n+m个雕塑可以等距离摆放(需要移动一些原有雕塑).求n个雕塑移动的最小距离.
思路:数学分析 建参考系
分析:
1. 将n个雕塑中的其中一个作为原点,不需要移动.将圆的长度等比例缩小为n+m.这样这n+m个雕塑最终在圆上分别占据0,1,2,3...,n+m-1这些位置.
2. 求出原来n个雕塑在这样一个数轴的位置.即(n+m) * i / n,其中i为n雕塑的序号.
3. 求得的n个雕塑的位置通过四舍五入(floor(pos+0.5)),可以求得最接近的位置的坐标,相减得需要移动的距离.最后把距离总和等比例放大即可.
代码:
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
double n, m, ans, pos;
while (scanf("%lf %lf", &n, &m) == 2) {
ans = 0;
for (int i = 1; i < n; i++) {
pos = (n + m) / n * i;
ans += fabs(pos - floor(pos + 0.5));
}
printf("%.4lf\n", ans / (m + n) * 10000);
}
return 0;
}