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. Linux路由器

    Linux路由器 武溪嵌人 钻研嵌入式,改变未来 http://blog.csdn.net/zhang_danf     Linux路由器 http://blog.csdn.net/zhang_dan ...

  2. Linux编译多个不同目录下的文件以及静态库、动态库的使用

    先看两篇博文,作为基础知识.如果对C/C++编译链接过程都了解的话,可以跳过不看. http://www.firedragonpzy.com.cn/index.php/archives/2556 ht ...

  3. socket为send和recv设置超时时间

    linux和windows下用setsockopt设置SO_SNDTIMEO,SO_RCVTIMEO的参数的一点区别 UDP的socket在某些情况:如对方关闭时,本地可能sendto不出去数据,然后 ...

  4. HDU 4350 Card

    打表找规律,比赛应付了一下,其实还可以把内存再优化一半掉,下面的0都是手动填充的,可以优化掉 题意: T个测试数据 下面52个数字表示 从栈顶到栈底的52个数 n l r表示 从栈顶下数 [l,r] ...

  5. Ubuntu_文件夹名字转化成英文

    打开终端命令行输入: export LANG=en_US xdg-user-dirs-gtk-update 之后重启,就看到中文的文件夹变成英文的了 想要换回中文的输入: export LANG=zh ...

  6. SetWindowLong

    SetWindowLong函数介绍 收藏 SetWindowLong函数介绍 SetWindowLong Unicode 函数原型 LONG SetWindowLong(hwnd,nIndex,lNe ...

  7. Ubuntu下装QQ2012,让linux小白们不怕脱离windows

    嘿嘿,很多人可能跟我一样,QQ上同学群里会通知一些事项,所以我们希望可以在linux下开QQ,但是QQ官网做的QQ For Linux, 实在是烂的不行 那么怎么在linux下装我们平时在window ...

  8. 关于vs2005 __RPC__out __RPC__in 没有定义编译错误

    1. 下载WDK http://www.microsoft.com/en-us/download/details.aspx?id=11800 2. 安装WDK 3. vs2005 设置:工具--> ...

  9. hdu1869 六度分离(Floyd)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869 转载请注明出处:http://blog.csdn.net/u012860063?viewmode ...

  10. vs2005及以上版本的程序分发问题

    我们使用vs2005及以上版本编译的应用程序(C/C++),在客户机器运行时,会出现: “由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题” 那么,我们怎么解决这个问题呢 ...