POJ1328贪心

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,d;
typedef struct star
{
 double l,r;
}star;
star mango[1010];
bool comp(star a,star b)
{
 return a.l<b.l;
}
int main()
{
 double w;
 int flag,cas=0,number,i,x,y;
 while(scanf("%d%d",&n,&d)==2)
 {
  flag=1;
  cas++;
  number=1;//记录装置个数
  if(n==0&&d==0)break;
  for(i=0;i<n;i++)
  {
   scanf("%d%d",&x,&y);
   w=d*d-y*y;//岛屿只在sea上吧。。。。
   if(w<0||d<0)//很纠结,d<0竟然也要考虑,一直没有考虑结果wa了好多。。。。
   {
    flag=0;  
   }
   mango[i].l=x-sqrt(w);
   mango[i].r=x+sqrt(w);
  }
  if(flag==0)
  {
   printf("Case %d: -1\n",cas);
  }
  else
  {
   sort(mango,mango+n,comp);
   double right=mango[0].r;
   for(i=1;i<n;i++)
   {
    if(mango[i].r<=right) right=mango[i].r;//覆盖没有考虑清楚  这时候只能取小的那个区域右边界。。。一直没考虑到  wa了几次。。。。这笨脑袋
    else if(mango[i].l>right)
    {
     number++;
     right=mango[i].r;
    }
   }
   printf("Case %d: %d\n",cas,number);
  }
 }
 return 0;
}

题意:求出能够覆盖所有岛屿的最小雷达数目,可以以每个岛屿为圆心,做圆与坐标轴相交于两点(或无 或一个),问题转化为知道一定数量的区间,求可以使每个区间里至少有一个点的最少点的个数。。。。对所有的点以x经行排序,然后就可以贪心了哦。。。。


你可能感兴趣的:(POJ1328贪心)