南阳理工学院OJ_287_Radar

此题意思给定点集S={(xi,yi)i=1.2.3...n},求用圆心在x轴上,半径为d的圆覆盖S所需的圆的最少个数。
1.先把给出的岛的坐标(xi.yi)和半径r转化为在x轴上的区间,即当d-yi>=0时,圆心位于x轴上的区间为Ii=[ xi-sqrt(d^2-yi^2) , xi + sqrt( d^2 - yi^2 )],则转化为区间选点问题。
2.S中点(xi,yi),对应一个在x轴上的区间Ii=(li,ri),按照区间右端点ri从小到大排序,在区间集合中选择一个索引最小的区间,把选择的区间和与其相交的所有区间作为一组从T中删除,直到T为空集,此时搜到的组数最大

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
struct inteval
{
    double s,e;
}p[1005];
bool cmp(inteval a,inteval b)
{
    return a.e<b.e;
}
int main()
{
    int n,i,t=1;
    double d,x,y;
    while(~scanf("%d%lf",&n,&d))
    {
        if(n==0&&d==0) break;
        for(i=0;i<n;++i)
        {
            scanf("%lf%lf",&x,&y);
            p[i].s=x-sqrt(d*d-y*y); //区间啊区间
            p[i].e=x+sqrt(d*d-y*y);
        }
        sort(p,p+n,cmp);
        int len=1;
        double mark=p[0].e;
        for(i=0;i<n;++i)
        {
            if(p[i].s>mark)
            {
                len++;
                mark=p[i].e;
            }
        }
        printf("Case %d: %d\n",t++,len);
    }
 return 0;
}

 

posted @ 2013-04-26 14:14  小仪在努力~  阅读(247)  评论(0编辑  收藏  举报