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     }  

 

posted @ 2016-09-09 16:41  kikii233  阅读(95)  评论(0编辑  收藏  举报