您的位置:首页 > 其它

poj 1328 贪心

2012-04-01 10:21 387 查看
贪心。以每个岛屿为圆心,在x轴上求出雷达可能出现的区间,重叠的区间只用一个雷达

#include <iostream>
#include <algorithm>
#include <cmath>
#include <stdio.h>
using namespace std;
typedef double ll;
const int maxx=1000;
struct PO
{
ll l,r;
};
PO point[maxx+5];

bool cmp(PO a,PO b)
{
if(a.l==b.l) return a.r<b.r;
return a.l<b.l;
}

int main()
{
int n,i,d,cnt,tt=0,flag;
ll a,b,ll,rr,temp1,temp2;
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&d)!=EOF)
{
if(n==0 && d==0) break;
temp1=(d*1.0)*(d*1.0);
flag=0;
for(i=0;i<n;i++)
{
scanf("%lf%lf",&a,&b);
temp2=b*b;
if(d-b<0)
flag=1;
if(flag) continue;
point[i].l=a-sqrt((temp1-temp2)*1.0);
point[i].r=a+sqrt((temp1-temp2)*1.0);
}
if(flag){printf("Case %d: -1\n",++tt);continue;}
sort(point,point+n,cmp);
ll=point[0].l;
rr=point[0].r;
cnt=1;
for(i=1;i<n;i++)
{
if(rr<point[i].l)
{
cnt++;
rr=point[i].r;
ll=point[i].l;
}
else if(rr>=point[i].l && rr<=point[i].r) ll=point[i].l;
else{ll=point[i].l;rr=point[i].r;}
}
printf("Case %d: %d\n",++tt,cnt);

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