zoukankan      html  css  js  c++  java
  • uvalive 3708 Graveyard

    https://vjudge.net/problem/UVALive-3708

    题意:

    一个长度为10000的圆环上放着n个雕塑,每个雕塑之间的距离均相等,即这个圆环被n个点均分。现在需要加入m个雕塑,这m个雕塑任意放置,但是需要满足放置之后n+m个雕塑均分这个圆环。那么原来的雕塑就需要移动,求原来的雕塑移动的最小总距离。

    思路:

    首先,我们只需要移动原来的雕塑就可以解决问题,因为后面的m个雕塑可以任意放,所以直接放在安排好的位置上即可。其次,有一个雕塑是不需要移动的,至于为什么,我无法证明,但是可以直观的感觉到(刘汝佳大大用的是中位数这个证明)。所以,我的思路就是将安排好之后的位置求出来,再用原来的雕塑找最近的位置即可,猜测不会有两个雕塑选择相同的地方。一开始认为当m % n == 0 的时候不需要移动任何雕塑,结果证明是错的,因为改了这个就ac了(逃

    代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 #include <vector>
     5 using namespace std;
     6 
     7 double a[1005];
     8 double b[2005];
     9 
    10 int main()
    11 {
    12     int n,m;
    13 
    14     while (scanf("%d%d",&n,&m) != EOF)
    15     {
    16 
    17             for (int i = 0;i < n;i++)
    18                 a[i] = (double) 10000 / n * i;
    19 
    20             for (int i = 0;i < m + n;i++)
    21                 b[i] = (double) 10000 / (m + n) * i;
    22 
    23             double ans = 0;
    24 
    25             for (int i = 1;i < n;i++)
    26             {
    27                 int p1 = lower_bound(b,b+m+n,a[i]) - b;
    28                 int p2 = upper_bound(b,b+m+n,a[i]) - b;
    29 
    30                 if (b[p1] == a[i]) continue;
    31 
    32                 //printf("%f %f %f
    ",a[i],b[p1-1],b[p2]);
    33 
    34                 ans += min(a[i]- b[p1-1],b[p2] - a[i]);
    35             }
    36 
    37             printf("%.4f
    ",ans);
    38     }
    39 
    40 
    41     return 0;
    42 }
  • 相关阅读:
    ARP:地址解析协议,RARP
    pip 安装psutil 报错 error: command 'gcc' failed with exit status 1
    linux shell 控制脚本
    linux shell 呈现数据
    linux shell 处理用户输入
    shell结构化命令
    centos7 安装配置 squid作为正向代理
    linux基本脚本
    linux文件权限
    模拟垃圾分布
  • 原文地址:https://www.cnblogs.com/kickit/p/7569354.html
Copyright © 2011-2022 走看看