NYOJ 12 喷水装置(二)
- 描写叙述
- 有一块草坪,横向长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 喷水装置(二)的更多相关文章
- nyoj 12——喷水装置二——————【贪心-区间覆盖】
喷水装置(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...
- 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题
1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...
- NYOJ 12:喷水装置(二)(贪心,区间覆盖问题)
12-喷水装置(二) 内存限制:64MB 时间限制:3000ms 特判: No 通过数:28 提交数:109 难度:4 题目描述: 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n ...
- nyoj 题目12 喷水装置(二)
喷水装置(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...
- NYOJ 题目12喷水装置(二)
#include<iostream> #include<algorithm> #include<cmath> using namespace std; struct ...
- nyoj 6 喷水装置(一)
喷水装置(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以 ...
- [图形学] 习题8.12 NLN二维线段裁剪算法实现
Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...
- NYOJ 6.喷水装置(一)-贪心
喷水装置(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以 ...
- 剑指offer 12:二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解法一:设置标志为flag=1,逐个位移至不同位置,比较是否为1. C++实现 class Solution { publi ...
随机推荐
- Writing a Windows Shell Extension(marco cantu的博客)
Writing a Windows Shell Extension This is a technical article covering the content of my last week s ...
- Delphi中运行时改变panel的位置及大小(通过wm_SysCommand来实现)
procedure TForm1.pnl1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Int ...
- 矩形、占位符组件——axure线框图部件库介绍
矩形组件和占位符没有太多的区别,这里我们主要讲解矩形组件的操作和使用,占位符的操作各位可以按照矩形的操作方法进行练习一下. 矩形组件是一个矩形,它可以用来做很多的工作,比如页面上需要一块蓝色的背景,就 ...
- 基于visual Studio2013解决C语言竞赛题之1086任务分配
题目 解决代码及点评 /************************************************************************/ /* ...
- 【Bootstrap3.0建站笔记二】button可下拉弹出层
1.button可下拉弹出层: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hpbmFwbGFu/font/5a6L5L2T/fontsize/400 ...
- SpringMVC经典系列-12基于SpringMVC的文件上传---【LinusZhu】
注意:此文章是个人原创.希望有转载须要的朋友们标明文章出处,假设各位朋友们认为写的还好,就给个赞哈,你的鼓舞是我创作的最大动力.LinusZhu在此表示十分感谢,当然文章中如有纰漏.请联系linusz ...
- Enterprise Solution 企业管理软件开发框架
Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架 Enterprise Solution 是一套管理软件开发框架,在 ...
- Servlet过滤器——过滤器分析流量
1.概述 Servlet过滤器可以对用户提交的数据或服务器返回的数据进行更改.任何到达服务器的请求都会首先经过过滤器的处理.本实例应用过滤器的这个特点,编写了一个在过滤器中统计网站流量的实例. 本实例 ...
- PreTranslateMessage和TranslateMessage区别
PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码. ...
- FOJ 1607 Greedy division 数学题
题目地址: http://acm.fzu.edu.cn/problem.php?pid=1607 给定一个n,将n平均分成m份,问有几种方法,每种方法中找出最大的数.思路:就是求n的因子数.先将每个数 ...