zoukankan      html  css  js  c++  java
  • Uva 10382 (区间覆盖) Watering Grass

    和 Uva 10020几乎是一样的,不过这里要把圆形区域转化为能够覆盖的长条形区域(一个小小的勾股定理)

    学习一下别人的代码,练习使用STL的vector容器

    这里有个小技巧,用一个微小量EPS来弥补浮点运算中的误差

     1 //#define LOCAL
     2 #include <vector>
     3 #include <cstdio>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <functional>
     7 using namespace std;
     8 
     9 const int MAXN = 10240;
    10 const double EPS = 1e-11;
    11 
    12 struct Range
    13 {
    14     double a, b;
    15     inline bool operator< (const Range& rhs) const
    16     {
    17         return a < rhs.a || (a == rhs.a && b < rhs.b);
    18     }
    19 };
    20 
    21 int main(void)
    22 {
    23     #ifdef LOCAL
    24         freopen("10382in.txt", "r", stdin);
    25     #endif
    26 
    27     int n, l, w;
    28     double lenth, width;
    29     vector<Range> ranges;
    30     ranges.reserve(MAXN);//reserve()函数提前设定容量大小,避免多次容量扩充操作导致效率低下
    31 
    32     while(scanf("%d%d%d", &n, &l, &w) == 3)
    33     {
    34         lenth = (double)l;
    35         width = w / 2.0;
    36         ranges.clear();
    37 
    38         for(int i = 0; i < n; ++i)
    39         {
    40             int position, radius;
    41             double xw;
    42             Range range;
    43 
    44             scanf("%d%d", &position, &radius);
    45             if(radius * 2 <= w)    continue;
    46             xw = sqrt((double)radius * radius - width * width);
    47 
    48             range.a = position - xw;
    49             if(range.a > lenth + EPS)    continue;
    50             else if(range.a - EPS < 0.0)    range.a = 0.0;
    51             range.b = position + xw;
    52             ranges.push_back(range);
    53         }
    54 
    55         sort(ranges.begin(), ranges.end());
    56 
    57         int minCover = 0;
    58         double start = 0.0, end = 0.0;
    59         for(vector<Range>::iterator pr = ranges.begin(); pr != ranges.end(); )
    60         {
    61             start = end;
    62             if(pr->a > start + EPS)
    63             {
    64                 minCover = -1;
    65                 break;
    66             }
    67             ++minCover;
    68             while(pr != ranges.end() && pr->a <= start)
    69             {
    70                 if(pr->b > end + EPS)    end = pr->b;
    71                 ++pr;
    72             }
    73             if(end > lenth + EPS)
    74                 break;
    75         }
    76         if(end + EPS < lenth)    minCover = -1;
    77         printf("%d
    ", minCover);
    78     }
    79     return 0;
    80 }
    代码君
  • 相关阅读:
    关于MySQL中的TRUNCATE语句
    关于在如何linux上部署禅道
    关于Python中的for...else...语句格式
    关于python中身份标识"is"与值运算符"=="
    Vite Vue3.0 使用 SVG Icon (自定义Vite插件)
    Python 远程开发树莓派 点亮LED灯
    Vue 基于elementUI的电梯导航
    JavaScript 原生数字千分位格式化函数(多功能的toLocaleString)
    JavaScript IntersectionObserver 图片懒加载及文字动态划线
    JavaScript await 优雅的捕获异常
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3949665.html
Copyright © 2011-2022 走看看