这道题思路很强。。。。不过这道题的格式有点坑。。。
注意不用去管那个 sample input #1.。。。。的输入格式的,输出格式也不用输出那个 。。。直接输入数字和输出数字就ok。。。
废话不多说直接上代码
//将原n个移到想要的地点就行,但想要的地点不好办,就假设长度为n+m,那么新地点就是1,2,3..整数
//然后floor(x+0.5)四舍五入找到最近点就行,至于两点不会抢一起,证明...
//相当于一开始有多少个点,他的距离就有多大,这样移动后的新地点就会是个整数
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,m;
double ans,pos;
// freopen("1.in","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
ans = 0.0;
for(int i=0;i<n;i++)
{
pos = (double)i/n*(m+n); //把长度化成n+m
ans += fabs(pos-floor(0.5+pos)); //移动到最近那一个整数点的距离
}
printf("%.4f\n",ans*10000/(n+m)); //注意这里的%0.4f不可写成%0.4lf,否则会一直wa,网上说好像是数据精度问题
} //最后注意把结果化成10000的长度下的答案。
return 0;
}
不过这样你也许会觉得会不会出现有两个点同时出现在一个整数点上,答案是不会的
证明:
为何这样是正确的?证明可行性
反证法:
假设有两个原雕塑搬到同一点 比如 2
那么 两个雕塑相距最远的可能是什么?(长度为n的时候)
1.49999999999 与 2.49999999999
即使这样两者距离也不过是等于1
显然可知原雕塑距离一定要大于1的 (长度变为n+m的时候)
固不可能搬到同一点(这也是当时把长度变为n+m的一个好处,便于推理)
参考文章:https://blog.csdn.net/zy691357966/article/details/39969175