ACM草地上洒水需要的最少的喷泉数

n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each sprinkler is installed at the horizontal center line of the strip. For each sprinkler we are given its position as the distance from the left end of the center line and its radius of operation. What is the minimum number of sprinklers to turn on in order to water the entire strip of grass?

Input

Input consists of a number of cases. The first line for each case contains integer numbers n, l and w with n ≤ 10000. The next n lines contain two integers giving the position of a sprinkler and its radius of operation. (The picture above illustrates the first case from the sample input.)

Output

For each test case output the minimum number of sprinklers needed to water the entire strip of grass. If it is impossible to water the entire strip output ‘-1’.

Sample Input

8 20 2

5 3

4 1

1 2

7 2

10 2

13 3

16 2

19 4

3 10 1

3 5

9 3

6 1

3 10 1

5 3

1 1

9 1

Sample Output

6

2

-1

解题思路:

题目的大一时给定一段草地的长度和宽度还有在这个草地上的喷泉的数目以及这些喷泉的所处的位置,还有这些喷泉的可以喷射的半径,问我们可不可以喷洒到这整块草地,如果不能喷射到整个草地,就输出-1,否则就要输出最少需要多少个喷泉就能喷洒到所有的区域。我们要注意的就是我们的草地是一块矩形区域,我们要把喷洒范围为圆形的喷泉转化为一个矩形来处理。就是用勾股定理来求出每一个圆形的喷洒区间(x-sqrt(r*r-w*w/4) , x+sqrt(r*r-w*w/4))。这样我们就把这个问题转换为了一个区间覆盖的问题。

程序代码:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int n,sum;
double l,w,s,r;
struct node
{
	double x;
	double y;
}a[10005];
double fun(node a,node b)
{
	return a.y>b.y;
}
int main()
{
	while(cin>>n>>l>>w)
	{
		sum=0;
		double g=0;
		for(int i=0;i<n;i++)
		{
			cin>>s>>r;
			a[i].x=s-sqrt(r*r-w*w/4);
			a[i].y=s+sqrt(r*r-w*w/4);
		}
		sort(a,a+n,fun);
		while(g<l)
		{
			int k;
			for(k=0;k<n;k++)
			{
				if(a[k].x<=g&&a[k].y>g)
				{
					g=a[k].y;
					sum++;
					break;
				}
			}
			if(k==n)
		    	break;
		}
		if(g<l)
			cout<<"-1"<<endl;
		else
			cout<<sum<<endl;
	}
	return 0;
}

  

时间: 2024-11-02 02:54:22

ACM草地上洒水需要的最少的喷泉数的相关文章

有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置)。小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界)。大反派超超想去捕捉可爱的小易,他手里有n个陷阱。第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉。你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易。 输入描述: 第一行为一个整数n

有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置).小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界).大反派超超想去捕捉可爱的小易,他手里有n个陷阱.第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉.你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易. 输入描述: 第一行为一个整数n(n ≤ 1000),表示超超一共拥有n个陷阱. 第二行有n个整数xi,表示第i个陷阱的横坐标 第三行

惊人发现:火星上有水!会有生命吗? 未完

今日导读 从1969年人类首次登月成功到现在,已经过去了半个世纪,在浩渺宇宙中,从月球到火星,人类一步步地进行太空探索,近日一个里程碑式的发现表明,火星地下埋藏着一个液态咸水湖.这意味着什么?这个红色星球上会有生命迹象么? 带着问题听讲解 Q1: 什么是"火星快车"? Q2: "slam dunk" 的本意是什么? Q3: 如果火星掩埋湖真实存在,科研人员可能会干什么? 新闻正文 There's water on Mars! Signs of buried lake

Light OJ 1291 Real Life Traffic 双连通最少添边数

题目来源:Light OJ 1291 Real Life Traffic 题意:最少添加几条边 可以使全图边双连通 思路:缩点 重新构图 答案就是(叶子节点数+1)/ 2 #include <vector> #include <cstdio> #include <cstring> #include <stack> #include <algorithm> using namespace std; const int maxn = 10010; s

hdoj 3987 Harry Potter and the Forbidden Forest 【求所有最小割里面 最少的边数】

Harry Potter and the Forbidden Forest Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1802    Accepted Submission(s): 602 Problem Description Harry Potter notices some Death Eaters try to slip

HDU 1326 Box of Bricks(水~平均高度求最少移动砖)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1326 题目大意: 给n堵墙,每个墙的高度不同,求最少移动多少块转使得墙的的高度相同. 解题思路: 找到平均墙的高度(即最后墙的高度),遍历所有墙,如果小于平均墙,则用平均墙减去高度即是要移动的高度,统计所有需要“补”的高度即可.注意输出. AC Code: 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int

规划(纪念我在ACM道路上的一年)

现在已经是晚上一点了,我早早的躺在床上,不能入睡,因为睡觉前看了一下我们学校今年区域赛的成绩总结,派出八次队伍,七个铜-- 再加上这两天ACM迎新杯的筹备过程的问题,让我产生了深深的思考-- 去年司老大带队出去比赛,作为弱校,第一次拿到银牌,当时整个协会都很高兴,觉得我们学校的ACM将要面临转机了,实际上不然,司老大的实力只代表了他自己-- 如今,司老大踏上了考研的道路,jjy学姐和wtw学长都保研了,这也就代表学校ACM的重担落在了我们身上.其实,现在大三的学长们只剩下一个队伍+一神一人,BC

HDU 1284 思维上的水题

其实如果想出了方法真的好水的说... 然而一开始想了好久都没想出来... 最后看了一下最大数据才32768 可以直接枚举...枚举每个硬币的数量 看看后来能不能凑够n 因为还是怕超时..(虽然只有3乘十的四次方)所以先枚举三分 然后二分 最后一分肯定足够 就不用了 自己好傻... #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h&

ACM:SCU 4437 Carries - 水题

SCU 4437  Carries Time Limit:0MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Practice Description Carries frog has nn integers a1,a2,…,ana1,a2,…,an, and she wants to add them pairwise. Unfortunately, frog is somehow afraid of carries (进位). S

HDU ACM 2054 A == B ? 水题

分析:水题,主要是要注意几个细节. #include<iostream> using namespace std; char a[100005],A[100005]; char b[100005],B[100005]; void Process(char* p,int count,char* p2) { int pos; bool is_real; int i=0,k=0,j; label: while(*(p+i)!='\0' && *(p+i)=='0') i++; if(