您的位置:首页 > 其它

UVA 10382

2014-11-26 18:26 197 查看
  题目大意是给定一个长l宽w的草坪,有n个喷水头,每个处于水平中间位置,给定其距离左边的距离和半径,求最少几个喷头可覆盖整个草坪。

  形状不是我们所关心的,我们只关心喷头能完全覆盖的区间,这里完全覆盖的区间指的是覆盖区域减去两端两个小半圆后剩下的矩形区域,我们令t=sqrt(r*r-w*w/4),之后用圆心坐标加减t即可得到区间左右端位置,此时问题转化成区间覆盖问题。

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct sprinkler{
double l,r;
}ss[10010];
bool cmp(struct sprinkler a,struct sprinkler b)
{
return a.r<b.r;
}
int main()
{
int n;
double l,w;
while(cin>>n>>l>>w){
int size=0,ans=0;
double tw=w/2;
for(int i=0;i<n;i++){
double o,r,t;
cin>>o>>r;
if(r<=tw) continue;
t=sqrt(r*r-(tw*tw));
ss[size].l=o-t;
ss[size].r=o+t;
size++;
}
sort(ss,ss+size,cmp);
double tl=0,tr=l;
int p=0;
while((tr-tl)>0.0000005){
while(p<size&&ss[p].r<=tl) p++;
bool yes=false;
double Max=-1,Maxp;
for(int i=p;i<size;i++){
if(ss[i].l<=tl){
yes=true;
if(ss[i].r>Max) {Maxp=i;Max=ss[i].r;}
}
}
if(!yes) break;
tl=Max;ans++;
}
if((tr-tl)<0.0000005) cout<<ans<<endl;
else cout<<-1<<endl;
}
return 0;
}


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