首页 > 代码库 > UVa3708 Graveyard (坐标缩放)

UVa3708 Graveyard (坐标缩放)

链接:http://acm.hust.edu.cn/vjudge/problem/15133
分析:太妙了,首先把圆的周长看作1,均匀分布着n个点,然后加入m个点后总共就有(n+m)个点,那么我们把圆的周长放大到(n+m),这么做有什么好处呢?就是(n+m)个雕塑的坐标全是整数点了,相应的原来在周长为1下的n个点的坐标从i/n方法(n+m)倍,由于要移动的雕塑位置为整数所以我们可以用四舍五入来找最近的整数点(目标雕塑位置),然后再把边长缩小回1,就是在边长为1的情况下n个雕塑移动到最近目标雕塑位置的距离,把n-1个点(第0个点不移动)要移动的距离累加然后把这个距离和等比例扩大10000。

 1 #include <cstdio> 2 #include <cmath> 3 using namespace std; 4  5 int main() { 6     int n, m; 7     while (scanf("%d%d", &n, &m) == 2) { 8         double ans = 0.0; 9         for (int i = 1; i < n; i++) {10             double pos = (double)i * (n + m) / n;11             ans += fabs(pos - floor(pos + 0.5)) / (n + m);12         }13         printf("%.4lf\n", ans * 10000);14     }15     return 0;16 }

 

UVa3708 Graveyard (坐标缩放)