/*
* 3708.cpp
*
* Created on: Jan 11, 2013
* Author: joker
*/
#define Main 1
#define INPUT_REDIRECT "3708.test"
#if Main
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main(int argc, char **argv) {
#ifndef ONLINE_JUDGE
freopen(INPUT_REDIRECT, "r", stdin);
#endif
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
double oldv = 10000.0 / n;
double newv = 10000.0 / (n + m);
double ans = 0;
for (int i = 1; i < n; ++i) {
double dis = i * oldv;
double a1 = dis - (int) (dis / newv) * newv;
double a2 = ((int) (dis / newv) + 1) * newv - dis;
ans += min(a1, a2);
}
printf("%.4lf\n", ans);
}
return 0;
}
#endif
在一般情况下,总可以选择一个点作为不变的点(至少可以有一个点不移动)。计算之后每个点的位置,然后计算其于移动到目标位置的最短距离,即距其左右最近的目标位置的最近距离。
至于为什么两个旧点不可能移动到同一个点:若两个旧点移动到同一个目标点,则两点之间的间距必然小于新点之间的间距,不符合题意。