Poj 1328 Radar Installation

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Poj 1328 Radar Installation相关的知识,希望对你有一定的参考价值。

原题:http://poj.org/problem?id=1328

题目给出了n个点(岛屿)的横纵坐标与半径d,要求在x轴上找到最少的点(雷达),以这些点为中心,半径为 d 的范围,包含所有的岛屿。

一开始直接想,对每个雷达可能出现位置做判断,用雷达去"找"岛,但很快否决,因为明显雷达可能的位置在特别坏的数据下会惊人地多,于是想用岛来"找雷达"

沿着这个思路分析了一下,发现对于每个岛,可以扫描到它的雷达范围为 x-sqrt(d*d-y*y)(原谅我不会打根号)到x+sqrt(d*d-y*y),这样我们就可以将问题变为给出若干个

区间,每个区间都包含至少一个点,要求点的数目最少。这就是区间选点的问题了,(难怪被放到贪心里),首先用上述方法得到区间,然后按右端点从小到大排序,从第一区间开始,

每次选择区间最后一个点,若该点被下一区间包含,则继续使用该点,否则选择下一个区间最后一个点。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <queue>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <cstdlib>
  7. #include <vector>
  8. #include <string>
  9. #include <algorithm>
  10. #define CLR(arr) memset(arr,0,sizeof(arr))
  11. #define N 1005
  12. #define MOD 1E9+7
  13. #define EPS 1E-6
  14. //#define LOCAL
  15. typedef long long ll;
  16. using namespace std;
  17. int n,d;
  18. typedef struct RANGE{
  19.     double L;
  20.     double R;
  21. }range;
  22. range ran[N];
  23. int cmp(const void *a,const void*b){
  24.     return ((range*)a)->R > ((range*)b)->R?1:-1;//这里有坑,用快排对浮点数排序使用方法与整数略有不同,用sort就遇不到这个坑。
  25. }
  26. int work(){
  27.     double cur=ran[0].R;
  28.     int ans=1;
  29.     for(int i=1;i<n;i++){
  30.         if(ran[i].L>cur){
  31.             cur=ran[i].R;
  32.             ans++;
  33.         }
  34.     }
  35.     return ans;
  36. }
  37. int main()
  38. {
  39.     #ifdef LOCAL
  40.     freopen("input.txt", "r", stdin);
  41.     //freopen("output.txt", "w", stdout);
  42.     #endif
  43.     int T=1,flag;
  44.     double t,x,y;
  45.     while(scanf("%d%d",&n,&d),n||d){
  46.         flag=1;
  47.         for(int i=0;i<n;i++){
  48.             scanf("%lf%lf",&x,&y);
  49.             if(flag&&y<=d&&d>0&&y>=0){//这是另外的坑,y和d的各种坑爹情况,不过奇怪的是将y>=0去掉也能AC,但时间反而变慢了。。
  50.                 t=sqrt(d*d-y*y);
  51.                 ran[i].L=x-t;
  52.                 ran[i].R=x+t;
  53.             }
  54.             else flag=0;
  55.         }
  56.         if(flag)qsort(ran,n,sizeof(ran[0]),cmp);
  57.         printf("Case %d: %d\n",T++,flag?work():-1);
  58.     }
  59.     return 0;
  60. }

因为做过区间选点问题的题目,代码很快撸出来了,但是因为一开始没用double被坑了一次,因为快排对浮点数的坑有被WA了一次(>﹏<)我觉得以后要转sort了,

各种角度看来都更方便。顺便感谢一下这个链接:http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/;

明天就要返校了,我讨厌长途。

以上是关于Poj 1328 Radar Installation的主要内容,如果未能解决你的问题,请参考以下文章

poj 1328 Radar Installation

poj1328 Radar Installation

POJ1328 Radar Installation

[POJ1328] Radar Installation

Radar Installation POJ - 1328

poj1328Radar Installation