pid=12">喷水装置(二)

时间限制: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。

例子输入
2
2 8 6
1 1
4 5
2 10 6
4 5
6 5
例子输出
1
2
来源
《算法艺术与信息学竞赛》

贪心解决这个问题

#include"stdio.h"
#include"math.h"
#include"stdlib.h"
#define N 100005
struct node
{
double l,r; //记录每一个水龙头能灌溉的左右边界
}f[N];
int cmp(const void*a,const void*b)
{
return (*(struct node*)a).l<(*(struct node*)b).l?-1:1;
}
int main()
{
int t,n,i,j;
double w,h,x,r;
scanf("%d",&t);
while(t--)
{
scanf("%d%lf%lf",&n,&w,&h);
h/=2;
for(i=0,j=0;i<n;i++)
{
scanf("%lf%lf",&x,&r);
if(r<h) //半径太小
continue;
double d=sqrt(r*r-h*h);
f[j].l=x-d;
f[j++].r=x+d;
}
n=j;
qsort(f,n,sizeof(f[0]),cmp);
double rr=0,cur;
int cnt=1;
for(i=0;i<n;i++) //从0点取最右边的那个喷水装置
{
if(f[i].l>0)
break;
if(rr<f[i].r)
rr=f[i].r;
}
if(rr==0)
{
printf("0\n");
continue;
}
for(cur=0;i<n;i++)
{
if(rr>=w)
break;
if(f[i].l<=rr) //从交叉地方取一个最右边的那个喷水装置
{
if(f[i].r>cur)
cur=f[i].r;
}
if(f[i].l>rr)
{
if(f[i].l>cur)
{
cnt=0;
break;
}
else
{
cnt++;
rr=cur;
cur=0;
}
}
}
if(rr<w) //最后特殊处理边界点
{
if(cur<w)
cnt=0;
else
cnt++;
}
printf("%d\n",cnt);
}
return 0;
}

NYOJ 12 喷水装置(二)的更多相关文章

  1. nyoj 12——喷水装置二——————【贪心-区间覆盖】

    喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...

  2. 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题

    1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...

  3. NYOJ 12:喷水装置(二)(贪心,区间覆盖问题)

    12-喷水装置(二) 内存限制:64MB 时间限制:3000ms 特判: No 通过数:28 提交数:109 难度:4 题目描述: 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n ...

  4. nyoj 题目12 喷水装置(二)

    喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...

  5. NYOJ 题目12喷水装置(二)

    #include<iostream> #include<algorithm> #include<cmath> using namespace std; struct ...

  6. nyoj 6 喷水装置(一)

    喷水装置(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以 ...

  7. [图形学] 习题8.12 NLN二维线段裁剪算法实现

    Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...

  8. NYOJ 6.喷水装置(一)-贪心

    喷水装置(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以 ...

  9. 剑指offer 12:二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解法一:设置标志为flag=1,逐个位移至不同位置,比较是否为1. C++实现 class Solution { publi ...

随机推荐

  1. Qt入门-字符串类QString

    原地址:http://blog.csdn.net/xgbing/article/details/7770854 QString是Unicode字符的集合,它是Qt API中使用的字符串类. QStri ...

  2. 一个很简单的php留言板。。。。搭建在sae上的。。。

    我在sae上搭建了一个个人简历的页面: 有兴趣的可以访问  http://671coder.sinaapp.com/ 在做下面一个简单的留言板的时候,卡了我很久,虽然完全没用过php..但是还是最后勉 ...

  3. hdu 4812 D Tree(树的点分治)

    D Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total ...

  4. struts2 一个简洁的struts.xml

    struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUB ...

  5. GoldentGate Oracle to Oracle 初始化具体解释

    一.安装GoldenGate[源端,目标端] 1.创建ogg文件夹 [root@source ~]# mkdir /DBSoft/ogg [root@source ~]# cd /DBSoft/ogg ...

  6. 在Java中使用MD5和BASE64

    MD5: 在上一篇<Servlet的学习之Session(5)>中,为了能使获取的所有随机数都能有相同的位数,我们采用MD5获取随机数的消息摘要(或称数据指纹.数据摘要等等). MD5可以 ...

  7. [置顶] android关机闹钟设计思路

    1: 首先需要硬件支持,支持alarm中断触发开机,目前高通平台几乎都支持: 2:关机前需要在rtc-xxx.c中做到enable_irq_wake,和不disable alarm功能(默认开机后al ...

  8. Boost Thread学习笔记三

    下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost ...

  9. Redis:安装、配置、操作和简单代码实例(C语言Client端)

    Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...

  10. hdu 4712 Hamming Distance bfs

    我的做法,多次宽搜,因为后面的搜索扩展的节点会比较少,所以复杂度还是不需要太悲观的,然后加上一开始对答案的估计,用估计值来剪枝,就可以ac了. #include <iostream> #i ...