这道题要总共的雕像的移动距离最短,那么只需要把每一个雕像移动到离它最近的位置就行了,在解题之前需要证明两点:
1.排在最前面的雕像不用移动(这个是显然的)
2.两个雕像移动之后不可能在同一个位置(按照距离最短的原则移动每一个雕像,不可能出现两个雕像移动到同一个位置的情况),用反证法比较好证明,
只要两个雕像移动到了同一个位置,最后可以推导出的结果是,增加了 雕像的数量,平均距离反而增加了,这是和题设矛盾的,所以两个雕像不可能移动到
同一个位置。
在进行实际的代码编写的时候,用到了一个小技巧,将一圈的距离设为n+m,那么增加雕像之后的平分点的坐标就都是整数,原来的雕像的坐标点是小数,那么只需要
将这些小数坐标的点移动到与其相邻的整数点,那么距离总和就最小了,最后的答案再乘以10000就行了。
下面是AC代码:
#include <stdio.h>
#include <math.h>
int main(void)
{
int m, n;
int i;
double pos;
double sum;
while(scanf("%d %d",&n,&m) != EOF)
{
sum = 0.0;
for(i=1; i<n; i++)
{
pos = (m+n)/(double)n * i;
sum += fabs( pos - floor(pos+0.5) ) / (m+n);
}
printf("%.4lf\n", sum*10000);
}
return 0;
}