看的书上的例题
题目见https://icpcarchive.ecs.baylor.edu/ 找第3708题
我自己先做了一遍,虽然也是过了。但是那个代码很啰嗦。看了书上的代码。。。顿时感觉五体投地
代码如下:
#include <math.h>
#include <iostream>
using namespace std;
int main()
{
int n, m;
while(scanf("%d%d",&n,&m) == 2)
{
double ans = 0.0;
for(int i = 1;i < n;i++)
{
double pos = (double)i / n * (n + m);//计算需要移动的雕塑的坐标
ans += fabs(pos - floor(pos + 0.5)) / (n + m);
}
printf("%.4lf\n",ans * 10000);
}
return 0;
}
思路分析:
首先可以确定一点,不管怎么移动,第一个点(假设在0处)不用移动,然后如果n,m存在倍数关系,则ans=0;如果不存在,则计算这个点离最近的最终图上的点的距离(/10000),并累加。
这个真的是太巧妙了。
一个是坐标缩小,一个是四舍五入。同时通过四舍五入将第一种情况(n,m存在倍数关系)也恰巧包含了进去。
还是要继续学习。