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: }
  • 相关阅读:
    每天一个Linux命令(10)--cat命令
    每天一个Linux命令(09)--touch命令
    每天一个Linux命令(08)--cp命令
    每天一个Linux命令(07)--mv命令
    CentOS6下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)
    iptables配置服务器端口转发
    AD管理命令
    win7登入使用的是临时档案解决方法
    修复Dll文件
    iptables 用法
  • 原文地址:https://www.cnblogs.com/wuhenqs/p/3203114.html
Copyright © 2011-2022 走看看