您的位置:首页 > 其它

UVa 10382

2013-04-22 08:51 134 查看
/*
有一块草坪,长为l,宽为w,
在它的水平中心线上有n个位置可以安装喷水装置,
各个位置上的喷水装置的覆盖范围为以它们自己的半径ri为圆。求出最少需要的喷水装置个数。
将他映射到一边,变成区间覆盖问题

*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;

#define N 10005

struct line
{
double left,right;
}a
;

bool cmp(line a,line b)
{
return a.left<b.left;
}

int main()
{
int n;
double l,w,x,r,y;
int num;

while(scanf("%d%lf%lf",&n,&l,&w)!=EOF)
{
num=0;
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&x,&r);
if(2*r<=w)
continue;
y=sqrt(1.0*r*r-w*w/4.0);
a[num].left=x-y;
a[num].right=x+y;
num++;
}
if(num==0)
{
printf("-1\n");
continue;
}
sort(a,a+num,cmp);

bool flag=0;
int  cnt=0;
double left=0;
double right=0;

// for(int i=0;i<num;i++)
//  printf("%lf %lf++\n",a[i].left,a[i].right);

if(a[0].left<=0)
{

int i=0;
while(i<num)
{
int j=i;
while(j<num && a[j].left<=left)
{
if(a[j].right>right)
{
right=a[j].right;
}
j++;
}
if(i==j)  break;
cnt++;
left=right;

i=j;

if(left>=l)
{
flag=true;
break;
}
}
}
if(flag)
printf("%d\n",cnt);
else
printf("-1\n");

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: