POJ 1328 Radar Installation-放置雷达(区间贪心)

题意:
海上有n多岛,在海岸线上(x轴)建一个雷达能覆盖到与它距离不超过d的岛,求覆盖所有岛的最小雷达数。

思路:
一开始把题目看错了,以为是整点才能放的,然后不停的哇,其实思路也错了。简单推一下样例会知道:计算出每个点雷达在x轴上的可控范围,并保存。于是O(n)转化为n个区间,sort一下,求最小覆盖点,坑点(可能只是对于我来说的吧)最后输出的时候-1情况的ca++不要忘记(只能说实在是太菜了,这都能哇好几次,写个博客,记录下我有多蠢)

代码:
#include<cstdio>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn=100006;
struct node{
 double l,r;
 /*bool operator <(node a)const{
  return l<a.l;
 }*/
}k[maxn];
int cmp(node a,node b){
 return a.l<b.l;
}
int main(){
 int n,d;
 int ca=0;
 while(~scanf("%d%d",&n,&d),(n+d)){
  ca++;
  int flag=1;
  for(int i=0;i<n;i++){
   int a,b;
   scanf("%d%d",&a,&b);
   if(b>d)flag=0;
   double t=sqrt(d*1.0*d-1.0*b*b);
   k[i].l=a-t;
   k[i].r=a+t;
  } 
  if(flag==0)printf("Case %d: -1\n",ca);
  else{
   int ans=0;
   double p=-100000000;
   sort(k,k+n,cmp);
   /*
   for(int i=0;i<n;i++){
    printf("x=%.2f  y=%.2f\n",k[i].l,k[i].r);
   }
   */
   for(int i=0;i<n;i++){
    if(k[i].l>p){
     p=k[i].r ;
     ans++;
    }else if(k[i].r<p){
     p=k[i].r ;
    }
   }printf("Case %d: %d\n",ca,ans);
   
  }
  
 }
}
ps:姑娘加油!

猜你喜欢

转载自blog.csdn.net/running_acmer/article/details/80464332