UVa1388 - Graveyard
题意
在一周长为10000的圆上等距分布着n个雕塑,现又加入m个雕塑并使这n+m个雕塑等距分布,则这n个雕塑移动的最小距离是多少。
思路
n个雕塑中肯定有一个不需要动,把那个当做原点,加入m个雕塑之后有n+m个新坐标,把每个原来的坐标移动到离它最近的新坐标即可。
先把周长按比例缩小,求出雕塑原坐标,再累加移动距离。
总结
floor(pos+0.5)为pos四舍五入后的结果:四舍五入就相当于判断此雕塑离它最近的一个是哪个。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <cmath> 6 using namespace std; 7 8 int main() 9 { 10 int n, m; 11 while(scanf("%d%d",&n,&m) == 2) { 12 double ans = 0; 13 for(int i = 1 ; i < n ; i++) { 14 double pos = (double)i / n * (n + m); 15 ans += fabs(floor(pos + 0.5) - pos) / (n + m); 16 } 17 printf("%.4lf\n",ans * 10000); 18 } 19 return 0; 20 }