poj 1328 贪心

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



细心

题意:给出一些点的坐标看至少可以有多少个雷达可以把点全部都覆盖掉。。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
    double x,y;
    double lx,rx;
}p[10000];
bool cmp(node p1,node p2)
{
    return p1.x<p2.x;
}
int main()
{
    int n,d,flag=0,Case=0;
    while(~scanf("%d%d",&n,&d))
    {
        Case++;
        if(n==d&&n==0)break;
        flag=0;
        for(int i=0;i<n;i++)
        {
            scanf("%lf%lf",&p[i].x,&p[i].y);
            if(p[i].y>d)
              flag=1;
            if(flag)
            continue;
            p[i].rx=sqrt(d*d-p[i].y*p[i].y)+p[i].x;
            p[i].lx=p[i].x-sqrt(d*d-p[i].y*p[i].y);
        }
        if(flag)
        {printf("Case %d: -1\n",Case);
         continue;
        }
        sort(p,p+n,cmp);
        int num=1;
        double zuo;
        zuo=p[0].rx;
        for(int i=1;i<n;i++)
        {
            if(p[i].lx>zuo)
            {
                num++;
                zuo=p[i].rx;
            }
            else if(p[i].rx<zuo)   //注意
            {
                zuo=p[i].rx;
            }  
            //else  会出现p[i].rx>zuo&&p[i].lx<zuo 时无需改变下标
        }
        printf("Case %d: %d\n",Case,num);
    }
    return 0;
}
///*
//4 5
//-5 3
//-3 5
//2 3
//3 3
//*/

//按R进行从左到右排序
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>

using namespace std;

struct node
{
    double L,R;
} p[1001];
int cmp(node p1,node p2)
{
    return p1.R<p2.R;
}
int main()
{
    int n,d,num=0;
    while(cin>>n>>d)
    {
        num++;
        if(n==0&&d==0)
            break;
        int flag=0;
        for(int i=0; i<n; i++)
        {
            int u,v;
            cin>>u>>v;
            if(d<v)
            {
                flag=1;

            }
            else if(flag==0)
            {
                p[i].L=u-sqrt(d*d-v*v);
                p[i].R=sqrt(d*d-v*v)+u;
            }
        }
        if(flag)
        {
            printf("Case %d: -1\n",num);
            continue;
        }

        sort(p,p+n,cmp);
        double  xR=p[0].R;
        double  xL=p[0].L;
        int sum=1;
        for(int i=1; i<n; i++)
        {
            if(p[i].L<=xR)
            {
            }
            else if(p[i].L>xR)
            {
                xR=p[i].R;
                sum++;
            }
        }
        printf("Case %d: %d\n",num,sum);
    }
}


你可能感兴趣的:(poj 1328 贪心)