POJ 1328 (Radar Installation)

Radar Installation

Time Limit:1000MS  Memory Limit:10000K Total Submit:2704 Accepted:564

Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d. We use  Cartesian coordinate system, defining the coasting is the x-axis. The sea side  is above x-axis, and the land side below. Given the position of each island in  the sea, and given the distance of the coverage of the radar installation, your  task is to write a program to find the minimal number of radar installations to  cover all the islands. Note that the position of an island is represented by its  x-y coordinates.

Figure A Sample Input of Radar Installations

Input The input consists of several test cases. The first line  of each case contains two integers n (1<=n<=1000) and d, where n is the  number of islands in the sea and d is the distance of coverage of the radar  installation. This is followed by n lines each containing two integers  representing the coordinate of the position of each island. Then a blank line  follows to separate the cases. The input is terminated by a line  containing pair of zeros

Output For each test case output one line consisting of the test  case number followed by the minimal number of radar installations needed. "-1"  installation means no solution for that case.

Sample Input

3 2
1 2
-3 1
2 1
1 2
0 2
0 0

Sample Output

Case 1: 2
Case 2: 1

Source Beijing 2002

诈一看这个题目,或许就有了写想法.觉得不是无从下手,之前思路错了一次.之后看了网上的解题报告,才发现自己错了.

开始错的: 先把所有的点X点从大到小排一下. 再早左极限 再与s=2*(sqrt(d*d-y*y)).比较,错的原因就是如果下一个点,甚至下下个点的左极限在上个点的左极限之内的话,就会出错!

后来改了一点点:先把所有的左极限找出来,再来排左极限,当然 相应的s也要跟随排过去(这样就可以用数组结构体,只是当时用了快排了,就添加了一下,代码也就麻烦了一点.当然数据不多也是一个原因.) 废话不多说,直接贴代码!

#include <stdio.h>
#include <math.h>
void quick_sort(double b[],double a[],int l,int r)//这个快排就是来排左极限的。
{
    if(l<r)
    {   int i,j ,k,t;
        double x,y;
        i=l;j=r;x=b[l],y=a[l];
        while(i<j)
        {
            while(i<j&&b[j]>=x)
            j--;
            if(i<j)
            {k=i;t=j;
            b[i++]=b[j];
            a[k++]=a[t];
            }
            while(i<j&&b[i]<x)
            i++;
            if(i<j)
            {k=i;t=j;
            b[j--]=b[i];
            a[t--]=a[k];
            }
        }
        b[i]=x;
        a[i]=y;
        quick_sort(b,a,l,i-1);
        quick_sort(b,a,i+1,r);
    }
}
int main()
{
    int n,i,j,z,sum,temp=1;
    double d,t,p,q;
    double a[1500],b[1500],k[1500],s[1500];
    while(~scanf("%d %lf",&n,&d))
    {   z=0;
    sum=0;
        if(n==0&&d==0)
        break;
        for(i=1;i<=n;i++)
        {
        scanf("%lf%lf",&a[i],&b[i]);
        if(b[i]>d)
            {
                z=1;
            }
        }
        for(i=1;i<=n;i++)
        {
            k[i]=a[i]-sqrt(d*d-b[i]*b[i]);
            s[i]=sqrt(d*d-b[i]*b[i]);
            s[i]=2*s[i];
        }
        quick_sort(k,s,1,n);

       for(i=n;i>=1;i--)//这个循环就是来和s比较的。
             {  p=k[i];
                for(j=i-1;j>0;j--)
                  {
                      if(p-k[j]>s[j])//如果两个左极限之间的距离比s还大的话,说明要加一个雷达!
                            {
                                  sum++;
                                  break;//确定要了之后就从下一个开始判定了.直至最后一个i.
                            }
                       i--;
                 }
                 if(i==1)//判断最后一次还要不要再装一个雷达.
                   sum++;//雷达数.
             }

        if(z==1)
        printf("Case %d: -1\n",temp);
        else
        printf("Case %d: %d\n",temp,sum);
        temp++;
    }
    return 0;
}
时间: 2024-10-05 05:58:35

POJ 1328 (Radar Installation)的相关文章

POJ 1328(Radar Installation)

题目链接:http://poj.org/problem?id=1328 思路:贪心 一开始的思路: 1. 以第一个岛屿为圆心,d为半径画圆,记与x轴的焦点中较大的那个为第一个雷达的位置: 2. 以这个雷达位置为圆心,d为半径画圆,记下之后的岛屿中第一个不能被覆盖的: 3. 依次这样下去,直到不能找到这样的雷达: 但是题目中没有说坐标一定是整数所以不能以 坐标+=1 来遍历,在遍历的过程中也是有问题的debug了好久干脆放弃: 所以应该是记录以每个岛屿坐标为圆心,d为半径的圆与X交点的左右坐标,再

POJ 1328:Radar Installation

Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 50843   Accepted: 11415 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point loca

Poj 1328(雷达安装)几何+贪心

[题目描述]: 给定n个小岛以及这些小岛的位置,并输入雷达的辐射面积,问最少需要多少个雷达站才能覆盖所有小岛? [思路分析]: 本题首先想到的是运用贪心算法,但是算法想到了如何贪心?这道题我自己开始做之时只有一点思路,就是让每一个雷达覆盖较多的点,但是如何较多覆盖,这就是典型的数学问题了,自己没有思索出来,最后在网上看了题解才明白如何做.下面我们看看如何建图: 我们通过这个图首先运用了一个数学知识,就是以小岛为圆心,雷达辐射范围为圆心建立一个圆,该圆与x轴有一个交点,以该交点作为雷达站铺设点那么

POJ 1328、Radar Installation 贪心

jQuery的属性操作非常简单,下面以一个a元素来说明属性的获取/设置/删除操作 <body> <a>jquery.com</a> </body> 添加属性 $('a').attr('href', 'http://www.jquery.com') 添加多个属性 $('a').attr({'href':'http://www.jquery.com', 'title':'jquery.com'}) 获取属性 $('a').attr('href') class属性

poj1328(Radar Installation)

题目大意: X轴为陆地,X轴上方为大海,海中有多个小岛,坐标为(x,y).给你任意多个雷达,雷达的扫描范围i是一个以半径为D的圆,问你至少用几个雷达可以将所有小岛覆盖.如不能完全覆盖输出"-1". 解题思路: 简单贪心.以每个小岛为圆心作以半径为D的圆,找出与X轴相交的区间,意思为在这个区间上的任意一点都可以作为圆心,包含这个小岛. 这时就需要把所有小岛的在X轴的区间找到. 有交集的部分说明可以用一个圆覆盖.这是算出最小的圆, 先排序,排序之后找到最左边小岛的的右区间,然后看每一个小岛

【贪心专题】POJ 1328 G - Radar Installation (区间覆盖)

链接:click here~~ 题意: Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only

poj 1328 【Radar Installation】【几何转化、区间覆盖】

点击打开题目 Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 54970   Accepted: 12381 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a poi

Mondriaan&#39;s Dream - POJ 2411(状态压缩)

题目大意:有一些1*2的矩形,现在用这些小矩形覆盖M*N的大矩形,不能重复覆盖,并且要覆盖完全,求有多少种覆盖方式. 分析:可以使用1和0两种状态来表示这个位置有没有放置,1表示放置,0表示没有放置,可以有三种放置方式. 一,竖着放. 二,不放.三,横着放.直接DFS这些情况就行了................还是递归容易理解. 代码如下: =============================================================================

poj 1006(剩余定理)

生理周期 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 111426   Accepted: 34702 Description 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏捷,精力容易高度集中.因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天.对于每个人,我们想知道