解法就是直接贪心,每个点移动到距离最近的新的点上即可。因为原来2点的间距肯定比后来大,容易证明肯定不会有2点移动到重叠的位置上。(可以将前后的间距当作一致,在此基础上等距离移动相邻2点,容易想出2点不可能同时距离一个点距离最近)
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
int n,m;
while(scanf("%d%d",&n,&m) == 2) {
double res = 0.0;
for(int i = 1;i < n;i++) {
double pos = (double)i/n*(n+m);
res += fabs(pos-floor(pos+0.5))/(n+m);
}
printf("%.4lf\n",res*10000);
}
return 0;
}