题意:
在一个周长10000的圆上等距分布n个雕塑,现加入m个,求原先雕塑的最小移动距离
思路:
如果加入的雕塑是n的倍数,那自然不用移动,如果不是,那就求出间距,从一个旧雕塑出发(至少一个不要动)然后逐个选择移动的最小距离。
代码:
#include<cstdio>
#include<iostream>
#include<math.h>
const double len = 10000;
int n, m;
int main() {
double t, d1, d2;
while(scanf("%d%d", &n, &m)!=EOF) {
if(m%n==0) {
printf("0.0\n");
continue;
}
d1 = len/n*(1.0);
d2 = len/(n+m)*(1.0);
double sum = 0;
for(int i=1; i<n; i++) {
double t = i * d1;//第i个雕像的位置
double r = floor(t/d2);处于第几个,自然要四舍五入(更靠近)
double r1 = fabs(t - r*d2);
double r2 = fabs(t - (r+1)*d2);
if(r1 > r2) sum += r2;
else sum += r1;
}
printf("%.4lf\n", sum);
}
return 0;
}