当前位置: 代码迷 >> 综合 >> POJ 1328 Radar Installation-贪心+区间处理
  详细解决方案

POJ 1328 Radar Installation-贪心+区间处理

热度:30   发布时间:2023-11-19 22:49:02.0

仅供梳理思路巩固知识,侵删

题目在此!

题意:x轴上方一些点,问在x轴上建立雷达站,要求能覆盖到所有点,求最小的雷达站个数

参考博客

https://blog.csdn.net/ac_hell/article/details/51250550


心得体会:1)本题直观的想法是以雷达为中心,这么做当更新雷达位置时,例如向右挪,那么之前覆盖到的左边的点则空出去了。因此本题以点(岛屿)为中心,转化为可以覆盖到该点的范围,参照链接。(逆向思维)

2)区间类型 (极左从小到大)排序之后的遍历处理,肯定是和上一次的情况做对比, 分成两种情况,加一台机器或者不加。具体细节可以在纸上草稿。

    #include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <math.h>  #include <algorithm>  using namespace std;  struct node  {  double zuo, you;  } fei[2100], t;  int cmp(node a, node b)  {  return a.zuo < b.zuo;  }  int x[2100],y[2100];  int main()  {  int i, j, n, d, num, flag, s=0;  double z, p;  while(scanf("%d%d",&n,&d)!=EOF)  {  if(n==0&&d==0) break;  s++;  flag=0;  for(i=0; i<n; i++)  {  scanf("%d%d",&x[i],&y[i]);  if(y[i]>d)  flag=1;  }  if(flag)  printf("Case %d: -1\n",s);  else  {  for(i=0; i<n; i++)  {  z=sqrt(d*d*1.0-y[i]*y[i]*1.0);  fei[i].zuo=(double)x[i]-z;  fei[i].you=(double)x[i]+z;  }  sort(fei,fei+n,cmp);  num=0;  p=-100000000;  for(i=0; i<n; i++)  {  if(fei[i].zuo>p)  {  num++;  p=fei[i].you;  }  else if(fei[i].you<p)  {  p=fei[i].you;  }  }  printf("Case %d: %d\n",s,num);  }  }  return 0;  }  

  相关解决方案