看题传送门 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1323
题目大意:有一块草坪长为L宽为w,在其中心线的不同位置出装有n个点状的喷泉装置。每个喷泉装置i可以将以它为中心,半径为Ri的圆形区域润湿。求可以把整个草坪润湿的最少的喷水装置。
好多天以前A的题目
贪心。
做法是把喷泉装置的圆形区域转化为矩形区域。按每个能喷到的最左边的坐标进行排序。每次选择喷泉的时候务必保证喷泉左边能覆盖到上一个的右边,并且尽量靠右。
注意浮点数比较大小的方法。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int MAXN=10000+10;
struct sprinkler
{
double l,r;
bool operator <(const sprinkler &x)const
{
return l<x.l;
}
}sp[MAXN];
int main()
{
int n,len,w;
while(scanf("%d%d%d",&n,&len,&w)!=EOF)
{
int cnt=0,x;
double r,temp,h;
h=w/2.0;
for(int i=0;i<n;i++)
{
scanf("%d%lf",&x,&r);
if(r*2 <= w) //一开始没等于狂wa!!!!!
continue;
temp=sqrt(r*r-h*h);
sp[cnt].l=x-temp;
sp[cnt].r=x+temp;
cnt++;
}
sort(sp,sp+cnt);//按最左边的距离排序
double L=0,R=len,max_r;
int ans=0;
while(L<R)
{
max_r=0;
for(int i=0;i<cnt;i++)
if( sp[i].l-L <1e-16 && max_r - sp[i].r <1e-16 )
max_r=sp[i].r;
if(fabs(max_r-L)<1e-16)
{ ans=-1; break; }
ans++;
L=max_r;
}
printf("%d\n",ans);
}
}