poj1328

来源:互联网 发布:chrome linux 编辑:程序博客网 时间:2024/06/15 07:34
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>


using namespace std;


const int maxx=1010;


struct node
{
     double left,right;
}a[maxx];


bool cmp(node i,node j)
{
     return i.left<j.left;
}


int main()
{
    int n,d,t=0;
    while (cin>>n>>d)
    {
         if (n==0&&d==0) break;else t++;
         int x,y,flag=1;
         for (int i=1;i<=n;i++)
         {
              cin>>x>>y;
              if (y>d) flag=0;
              a[i].left=x-sqrt(d*d-y*y);
              a[i].right=x+sqrt(d*d-y*y);
         }
         if (flag)
         {
              sort(a+1,a+1+n,cmp);
              int ans=1;
              double radar;
              radar=a[1].right;
              for (int i=2;i<=n;i++)
              {
                if (a[i].right<radar) radar=a[i].right;
                else if (a[i].left>radar)
                {
                  ans++;
                  radar=a[i].right;
                }
              }
              cout<<"Case "<<t<<": "<<ans<<endl;
         }
         else cout<<"Case "<<t<<": -1"<<endl;


    }
    //cout << "Hello world!" << endl;
    return 0;
}
/*题意:有一个坐标轴 在X轴上方是海 下方是陆地 X轴是海岸线,海上有N个小岛,现在要在海岸线上安装雷达,
雷达的覆盖范围是一个以R为半径的圆,请用最少的雷达覆盖所有的小岛;当无法覆盖时 输出-1


思路:算出 每个小岛能被覆盖的雷达的圆心,即以小岛为圆心 R为半径 作圆,该圆与X轴的交点:
左交点为x-sqrt(R*R-y*y); 右交点为x+sqrt(R*R-y*y);
令当前雷达在第一个岛的右交点
按照 左交点 排序,如果i点的左交点在 当前雷达的右边 则需安装一个新雷达,更新雷达
否则 如果 i点的右交点也在当前雷达的左边 则把当前雷达的圆心更新为该点的右交点;*/
0 0
原创粉丝点击