博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 10382 - Watering Grass
阅读量:6307 次
发布时间:2019-06-22

本文共 1729 字,大约阅读时间需要 5 分钟。

  题目大意:有一条长为l,宽为w的草坪,在草坪上有n个洒水器,给出洒水器的位置和洒水半径,求能浇灌全部草坪范围的洒水器的最小个数。

  经典贪心问题:区间覆盖。用计算几何对洒水器的覆盖范围简单处理一下即可得到每个区间的范围,剩下的就是区间覆盖了。可参考

1 #include 
2 #include
3 #include
4 using namespace std; 5 #define MAXN 10000+10 6 7 struct Interval 8 { 9 int pos, r;10 double s, e;11 bool operator < (const Interval& in) const12 {13 return s < in.s;14 }15 };16 Interval interval[MAXN];17 18 double cover(double c, double a)19 {20 return sqrt(c*c - a*a);21 }22 23 int main()24 {25 #ifdef LOCAL26 freopen("in", "r", stdin);27 #endif28 int n, l, w;29 while (scanf("%d%d%d", &n, &l, &w) != EOF)30 {31 for (int i = 0; i < n; i++)32 {33 scanf("%d%d", &interval[i].pos, &interval[i].r);34 double t = cover(interval[i].r, w/2.0);35 interval[i].s = interval[i].pos - t;36 interval[i].e = interval[i].pos + t;37 }38 sort(interval, interval+n);39 double start = 0;40 int p = 0, ans = 0; 41 bool ok = true;42 while (start < l)43 {44 int q = p;45 double lmax = -1;46 while (p < n && interval[p].s <= start)47 {48 if (interval[p].e > lmax) lmax = interval[p].e;49 p++;50 }51 if (p == q || lmax <= start)52 {53 ok = false;54 break;55 }56 ans++;57 start = lmax;58 }59 if (ok) printf("%d\n", ans);60 else printf("-1\n");61 }62 return 0;63 }
View Code

 

转载于:https://www.cnblogs.com/xiaobaibuhei/p/3259486.html

你可能感兴趣的文章
机器学习:用初等数学解读逻辑回归
查看>>
如何在 Ubuntu 中管理和使用逻辑卷管理 LVM
查看>>
Oracle原厂老兵:从负面案例看Hint的最佳使用方式
查看>>
把自己Github上的代码添加Cocoapods支持
查看>>
C语言OJ项目参考(2493)四则运算
查看>>
零基础入门深度学习(二):神经网络和反向传播算法
查看>>
find和xargs
查看>>
数据结构例程—— 交换排序之快速排序
查看>>
WKWebView代理方法解析
查看>>
IOS定位服务的应用
查看>>
[SMS&WAP]实例讲解制作OTA短信来自动配置手机WAP书签[附源码]
查看>>
IOS中图片(UIImage)拉伸技巧
查看>>
【工具】系统性能查看工具 dstat
查看>>
基于zepto或jquery的手机端弹出框成功,失败,加载特效
查看>>
php引用(&)
查看>>
Delphi 操作Flash D7~XE10都有 导入Activex控件 shockwave
查看>>
oracle 学习笔记之名词解释
查看>>
MySQL Cluster搭建与测试
查看>>
python数据分析画图体验
查看>>
军规15 确保集成和调用第三方APP
查看>>