poj之旅——1328

题目描述:在一个坐标系中,给出一系列点的坐标,要求在x轴上找出尽量少的圆心,并保证以这些圆心画半径为r的圆能覆盖全部点。

题解:贪心,从最左边的点开始,尽量把圆心往右放,直到处于覆盖不了这个点的临界状态,然后在判断其后的点有多少被这个圆覆盖,最后圆的数量加一,重复。

参考程序:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;  
struct point  
{  
    double left, right;  
}p[2010], temp;  
  
bool operator < (point a, point b)  
{  
    return a.left < b.left;  
}  
int main(){
    int n;
    double r;
    int kase=0;
    while (cin>>n>>r && (n || r)){
          bool flag=false;
          for (int i=0;i<n;i++){
              double a,b;
              cin>>a>>b; 
              if (fabs(b)>r) flag=true;
              else{
                   p[i].left=a*1.0-sqrt(r*r-b*b);
                   p[i].right=a*1.0+sqrt(r*r-b*b);
              }
          }
          cout << "Case " << ++kase << ": ";  
          if (flag)  cout << -1 << endl; 
          else{
               int cnt=1;
               sort(p,p+n);
               temp=p[0];
               for (int i=1;i<n;i++)
                 if (p[i].left>temp.right){
                     cnt++;
                     temp=p[i];
                 }
                 else if (p[i].right<temp.right){
                      temp=p[i];
                 }
               cout << cnt << endl;
          }
    }        
    return 0;
}


你可能感兴趣的:(poj之旅——1328)