因为是均匀分布,所以如果在摆放好所有的雕塑之后,统一移动相同的距离依旧是均匀分布的,所以这题可以先把某一个雕塑当做原点固定不动。并将这个墓碑的距离设置为0。

之后利用等比缩放,将整个圆缩放成一个周长为 n + m 的圆,于是原有的雕塑的位置可以利用公式得出:

LA 3708 Graveyard 墓地雕塑 NEERC 2006-LMLPHP

又因为,圆已经缩放成周长为 n + m 。所以每一个雕塑都在整数点上,一次可以按照下面的公式算出当前雕塑离最近的整数点的距离是多少:

LA 3708 Graveyard 墓地雕塑 NEERC 2006-LMLPHP

最后对所有的距离求和之后按照之前缩小的比例再次放大就OK了。

下面附AC代码:

   1: #include <stdio.h>
   2: #include <math.h>
   3: #include <iostream>
   4: #include <cstdarg>
   5: #include <algorithm>
   6: #include <string.h>
   7: #include <stdlib.h>
   8: #include <string>
   9: #include <list>
  10: #include <vector>
  11: #include <map>
  12: #define LL long long
  13: #define M(a) memset(a, 0, sizeof(a))
  14: using namespace std;
  15:  
  16: void Clean(int count, ...)
  17: {
  18:     va_list arg_ptr;
  19:     va_start (arg_ptr, count);
  20:     for (int i = 0; i < count; i++)
  21:         M(va_arg(arg_ptr, int*));
  22:     va_end(arg_ptr);
  23: }
  24:  
  25: int main()
  26: {
  27:     int n, m;
  28:     while(~scanf("%d%d", &n, &m))
  29:     {
  30:         double pos = 0.00, ans = 0.00;
  31:         for (int i = 1; i <= n; i++)
  32:         {
  33:             pos = 1.00 * i * (n + m) / n;
  34:             ans += fabs(pos - floor(pos + 0.5));
  35:         }
  36:         printf("%.4lf\n", ans * 10000.0 / (n + m));
  37:     }
  38:     return 0;
  39: }

05-04 01:37