题目链接:http://poj.org/problem?id=1328
题意:给出海上有n个小岛的坐标,求发出的信号可以覆盖全部小岛的最少的雷达个数。雷达发射信号是以雷达为圆心,d为半径的圆,雷达都在x轴上。
分析:1.刚开始就知道这道题要用贪心做,但是一下子想不出该如何贪心。然后图图画画后发现只要求出可以覆盖每一个小岛的雷达的区间范围即可,然后可以转化为贪心区间求点问题。正好今天在复习贪心思想时在紫书上看到这个例子啦~(紫书P233)
2.贪心区间求点,就是排序后尽量选择重合区间多的地方选择放点。
3.但是还是WA了一次,因为标记数字is[]没有初始化...T^T题目有多组输入,单独测样例时答案都对,一起测多组的时候就错,还好后来还是发现了这个错误。
贴代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
struct QuJian
{
double l,r;
};
int cmp(QuJian a,QuJian b)
{
if(a.r==b.r)
return a.l>b.l;
return a.r<b.r;
}
QuJian qu[];
int is[];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,d;
int t=;
while(scanf("%d%d",&n,&d)==)
{
if(!n&&!d)
break;
int x,y;
memset(is,,sizeof(is));
double tp;
bool flag=;
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
tp=d*d-y*y;
if(tp<||d<)
{
flag=;
continue;
}
if(flag)
{
qu[i].l=x-sqrt(tp);
qu[i].r=x+sqrt(tp);
}
}
if(!flag)
printf("Case %d: -1\n",++t);
else
{
int ans=;
sort(qu,qu+n,cmp);
//for(int i=0;i<n;i++)
// cout<<qu[i].l<<" "<<qu[i].r<<endl;
for(int i=;i<n;i++)
{
if(is[i])
continue;
ans+=;
for(int j=i+;j<n;j++)
{
if(qu[j].l<=qu[i].r)
is[j]=;
}
}
printf("Case %d: %d\n",++t,ans);
}
}
return ;
}