poj1328 Radar Installation —— 贪心

来源:互联网 发布:it前沿技术 编辑:程序博客网 时间:2024/04/29 22:08

题目链接: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;}


0 0
原创粉丝点击