nyoj12 喷水装置(二)
2015-08-01 00:44
295 查看
喷水装置(二)
时间限制:3000 ms | 内存限制:65535 KB难度:4
描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。
输入第一行输入一个正整数N表示共有n次测试数据。
每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。
随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。输出每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。
如果不存在一种能够把整个草坪湿润的方案,请输出0。样例输入
22 8 61 14 52 10 64 56 5
样例输出
12
恩,这个题就是贪心里的关于区间包含之类的问题,类似与poj中的Radar Installation 。以装置的半径和横坐标判断区间的上下限。按区间上限从小到大排找到不重合不交叉的区间个数即为最少的装置个数。也是2 3个月之前的代码了,可能有点麻烦,下一篇我找poj里的贴
#include<stdio.h> #include<math.h> #include<algorithm> using namespace std; struct node { double ai,bi; }loop[10010]; bool cmp(node a,node b) { if(a.ai!=b.ai)return a.ai<b.ai; else return a.bi>b.bi; } int main() { int N,n,w,h,i,j,k,xi,ri,num; double l; scanf("%d",&N); while(N--) { scanf("%d%d%d",&n,&w,&h); for(i=0,j=0;i<n;++i) { scanf("%d%d",&xi,&ri); if(ri>=h/2) { loop[j].ai=xi*1.0-sqrt(ri*ri-h*h/4); loop[j].bi=xi*1.0+sqrt(ri*ri-h*h/4); j++; } } sort(loop,loop+j,cmp); l=0;num=0; double start=0; for(i=0;i<j;++i) { if(loop[i].ai<=start) { l=loop[i].bi; while(loop[i].ai<=start&&i<j) { l=max(l,loop[i].bi); i++; } start=l;i--;num++; } if(start>=w)break; } if(start>=w)printf("%d\n",num); else printf("0\n"); } return 0; }
相关文章推荐
- springMVC --全局异常处理(两种方式)
- 递归--阶乘/斐波那契数列/判断回文字符串/字符串翻转
- php-基础知识(1)
- 50个技巧提高PHP网站的执行效率
- 斐波那契数列
- CentOS6 下编译安装 MySQL 5.6.26
- 在Spring中加入Struts2
- POJ 2096 多系统找n种bug需要的天数期望--期望dp
- 去边破圈
- Web单元测试常用工具介绍
- HDU 2199 --Can you solve this equation?【二分水题】
- hdu 5335
- JSP
- Ubuntu 字体设置:使用Windows 字体
- 私有继承与保护继承
- QQ第三方登录
- HDU - 1596 find the safest road (最短路水题)
- 成功将qt程序移植到arm板上
- Harry Potter and the Forbidden Forest(割边最小的最小割)
- c++ 虚函数和纯虚函数