poj1328 Radar Installation —— 贪心

题目链接:http://poj.org/problem?id=1328


题解:区间选点类的题目,求用最少的点以使得每个范围都有点存在。以每个点为圆心,r0为半径,作圆。在x轴上的弦即为雷达可放置的范围。这个范围可用勾股定理求得。记录每个点的范围,然后排序,贪心。

(由于不熟悉qsort的用法,折腾了一个小时。后来清晰了:qsort 的cmp是通过正负判断(但结构体又不是),而sort的cmp是通过对错判断,即0或1。所以qsort的cmp用‘-’(结构体除外),sort的cmp用‘<’和‘>’判断,决定以后用sort,要加上<algorithem>  和 std。


代码如下:

 

#include<cstdio>//poj 1328 贪心
#include<cmath>
#include<cstdlib>
#include<cstring>

typedef struct
{
    double l,r;
}edge, *E;
edge e[1010];

int cmp(const void *a, const void*b)
{   
    return ((E)a)->r > ((E)b)->r?1:-1;
}

int solve(int n)
{
    int sum = 1;
    double brim = e[0].r;
    for(int i = 1; i<n; i++)
    {
        if(brim<e[i].l)
        {
            brim = e[i].r;
            sum ++;
        }
    }
    return sum;
}

int main()
{
    int n,B,t = 0;
    double r0,x,y,r;
    while(scanf("%d %lf",&n,&r0) && (n||r0))
    {
        B = 1;
        for(int i = 0; i<n; i++)
        {
            scanf("%lf %lf",&x,&y);
            if(y>r0)
                B = 0;
            r = sqrt(r0*r0-y*y);
            e[i].l = x - r;
            e[i].r = x + r;
        }

        if(B)
        {
            qsort(e,n,sizeof(e[0]),cmp);
            printf("Case %d: %d\n",++t,solve(n));
        }
        else
            printf("Case %d: -1\n",++t);
    }
    return 0;
}


 

posted on 2017-02-10 15:30  h_z_cong  阅读(124)  评论(0编辑  收藏  举报

导航