题目:x轴上方有n个目标点,坐标全为整数,为了扫描到他们,在x轴上安放雷达,每一个雷达扫描半径为d,问至少安放多少雷达。

思路:首先,以每个岛为圆心,画出一个圆,应该与x轴有1或2个交点(否则直接输出不可能了)。

这样,n个点就有n个区间,我们以右端点作为排序键,进行排序。维护一个当前区间最小的右端点,当一个新的区间拿来比较的时候 ,若新区间的左端点小于维护的最小右端点,这说明这个新区间所代表的岛可以被旧雷达所扫到,不做动作,而假如新区间的左端点大于当前区间的右端点,说明要新雷达了,雷达数+1,并且新区间变为当前区间,其右端点为当前区间最小右端点。

 

 

 

 
  
  1. #include<iostream> 
  2. #include<cmath> 
  3. #include<algorithm> 
  4. using namespace std; 
  5.  
  6. const int island_max=1000; 
  7.  
  8. class Node 
  9. public
  10.    float x; 
  11.    float y; 
  12. }; 
  13.  
  14. class Region 
  15. public
  16.    float left; 
  17.    float right; 
  18. }; 
  19.  
  20. Node island[island_max]; 
  21. Region island_re[island_max]; 
  22.  
  23. bool cmp(Region a,Region b) 
  24.    return a.right<b.right; 
  25. int main() 
  26.     
  27.     int num; 
  28.     float rad; 
  29.      
  30.     for(;;) 
  31.     { 
  32.       //**********输入每个点的坐标,并判断是否有解*****  
  33.        cin>>num>>rad; 
  34.        if(!(num&&rad)) 
  35.           break
  36.        bool flag = false;  
  37.        static int count = 1; 
  38.        for(int i=0;i<num;i++) 
  39.        { 
  40.           Node temp; 
  41.           cin>>temp.x>>temp.y; 
  42.           island[i]=temp; 
  43.           if(island[i].y>rad) 
  44.              flag  = true
  45.        } 
  46.         
  47.   
  48.  
  49.        if(flag) 
  50.        { 
  51.            cout<<"Case "<<count++<<": -1"<<endl; 
  52.            continue
  53.        } 
  54.  
  55.       /*************算出每个点的区间 ******/ 
  56.        
  57.    
  58.        
  59.       for(int i=0;i<num;i++) 
  60.       { 
  61.          island_re[i].left = island[i].x-sqrt(rad*rad-island[i].y*island[i].y); 
  62.          island_re[i].right = island[i].x+sqrt(rad*rad-island[i].y*island[i].y); 
  63.          
  64.       }  
  65.    
  66.  
  67.       sort(island_re,island_re+num,cmp); //根据交点的右坐标进行排序  
  68.        
  69.    
  70.       /***********根据每个区间算情况********/ 
  71.        
  72.       int radar = 1; 
  73.       float tmp; 
  74.       int i; 
  75.        
  76.        
  77.       for(i = 0,tmp = island_re[0].right;i<num-1;i++) 
  78.       { 
  79.         if(island_re[i+1].left>tmp) 
  80.            { 
  81.               radar++; 
  82.               tmp = island_re[i+1].right; 
  83.            } 
  84.       } 
  85.        
  86.       cout<<"Case "<<count++<<": "<<radar<<endl; 
  87.    } 
  88.    system("pause"); 
  89.    return 0; 
  90.        
  91.