题目大意:
在一个周长为10000的圆上等距离的分配雕塑的位置,现在要插入m个雕塑,求最短移动距离可以使得插入后的雕塑的位置仍然是等距离的。
思路:
求出原来的距离d0,求出插入后的距离d1,利用循环,d= i*d0知道每一个在原来的坐标系上的坐标,然后利用a = floor(d/d1),t = a * d1知道现在要插入的位置在哪,相减就是距离。
代码:
#include <iostream>
using namespace std;
#include <stdio.h>
#include <cstring>
#include <cmath>
int main() {
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
if(m % n== 0) printf("0.0\n");
else {
double d0 = 10000/(n * 1.0);
double d1 = 10000/((n + m) * 1.0);
double ans = 0.0;
for(int i = 1; i < n; i++) {
double d = i * d0; //原来插入的位置
int a = floor(d/d1);//比例 一般插入前面位置
double k = a * d1; //现在应该插入的位置
if(fabs(d - k) < fabs (d - (a+1.0)*d1))
ans += fabs(d - k);
else
ans += fabs(d - (a + 1.0)*d1);
}
printf("%.4lf\n",ans);
}
}
return 0;
}