代码和题目都在训练指南里面有了。在这里简单地证明一下书上提到的漏洞。
①首先,我们不知道是不是一定有一个雕塑没有移动
证明:书中把圆进行了缩放,缩放后圆的周长为(n+m),相邻的两个最终位置之间间隔为1.
书上提示说证明思路在例题3中已经展示过了,这里描述如何把本问题的证明转化到例题3的证明。
首先我们先画出间距为1且在同一直线上的三个点。然后,我们在原n个位置中任选一个不移动的点作为这三个点的中点,如图所示。
那么,以这个不移动的点为中心,它的左右半圆上 原先分别有(n-1)/2个初始点。对于每个初始点,截取下来完整的单位长度的线段,把截取下来的线段重叠到左边的线段,根据这个方法把左半圆上的点全部映射到左边的线段上。右半圆进行相同的处理。
由圆的对称性易得两边的两条线段是关于中心点对称的。
对于线段[-1/2,1/2]上的点,问题就转化成了例题3中证明的线段上点到点x0的最短距离和的问题。显然不移动的点一定是线段[-1/2,1/2]的中点。证毕。
②会不会有两个雕塑移动到相同的位置。
假设会有两个雕塑移动到相同的位置。(蓝点,均移动到中间的红点)
根据题设有
x1+x2=1
x3+x4=1
x2<x1
x3<x4
那么肯定有x2+x3=(n+m)/n<(1/2+1/2)=1
显然不成立,所以不会有两个雕塑移动到相同的位置。
代码如下
#include<bits/stdc++.h>
using namespace std;
int n, m;
int main()
{
while (scanf("%d%d", &n, &m) == 2) {
double ans = 0;
for (int i = 1; i < n; i++) {
double p = (double)i * (n + m) / n;
ans += fabs(p - floor(p + 0.5)) / (n+m)*1e4;
}
printf("%.4f\n", ans);
}
}