zoukankan      html  css  js  c++  java
  • LA 3708 Graveyard 墓地雕塑 NEERC 2006

    在一个周长为 10000 的圆上等距分布着 n 个雕塑。现在又有 m 个新雕塑加入(位置可以随意摆放),希望所有 n + m 个雕塑能在圆周上均匀分布。这就需要移动一些原有的雕塑。要求 n 个雕塑移动的总距离最小。

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

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

    image

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

    image

    最后对所有的距离求和之后按照之前缩小的比例再次放大就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
    ", ans * 10000.0 / (n + m));
      37:     }
      38:     return 0;
      39: }
  • 相关阅读:
    牛客网 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-低年级组)求最大值
    HDU 5024 Wang Xifeng's Little Plot(DFS)
    java正则表达式
    48.自用qss
    47.使用帧缓存对象生成叠加
    46.Qt 使用OpenGL绘制立方体
    45.Qt openGL实现三维绘图
    44.Qt通过子类化qstyle实现自定义外观
    43.qt通过qss自定义外观
    42.写入XML
  • 原文地址:https://www.cnblogs.com/wuhenqs/p/3203114.html
Copyright © 2011-2022 走看看