【贪心专题】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 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

【解题思路】

这道题描述是这样的:

在给定的一条海岸线两侧分别是海跟陆地,在海里有若干个用x,y坐标标示位置的岛屿,岸上安排雷达站,每个雷达站有自己的覆盖范围,最大范围是以半径d形成的圆。要求求出最少需要多少个雷达站覆盖所有岛屿。

岛屿坐标随机给出。

区间覆盖的贪心问题:

相对原点而言,我们假定x负半轴方向为“左”,x正半轴方向为“右”。

首先对每个点求出能覆盖到这个点的在海岸线上左右两边极限位置的坐标(注意是圆心坐标)。也就是

在雷达(圆)的左半圆上或者在雷达(圆)的右半圆上,换句话说当岛屿到雷达的距离等于d的时候,形成的圆分别会与x轴相交一点,根据这个点可以求出极限坐标:

最左为:x + sqrt(d*d-y*y); 最右为:x - sqrt(d*d-y*y);

每个岛屿都有这样的最左和最右可被侦测坐标。

假定当前的岛屿为a,当前的下一个为next。

1.如果next的最左边坐标比a的最右边大,只能再设一个雷达来侦测next了,sum++。

2.如果next的最左边坐标比a的最右边小,这时会有两种情况。

A.next最右边<a最右边

B.next最右边>=a最右边

对于B情况,我们可以直接侦测到a和next,下一步找next的下一个岛屿。

对于A情况,也就等价于next包含于a, 这样就应该把next的最右边做为衡量标准了.

然后按照左极限位置对这些点排序。然后从左到右找到每个雷达最多能覆盖的岛屿数。最后就得到了所需的雷达数。当有岛屿离海岸的距离大于雷达覆盖半径,则输出不可能

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
const double pi=acos(-1.0);
const double eps=1e-6;
#define CLR(a,b) sqrt(a*a-b*b)
struct node
{
    double left,right;
} p[1001];
bool cmp(node a,node b)
{
    return a.left<b.left;
}
int main()
{
    int x,y,n,k,tot=1;
    while(~scanf("%d%d",&n,&k),n|k)
    {
        memset(p,0,sizeof(p));
        bool flag=false;
        int sum=1;
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d",&x,&y);
            if(y>k)
            {
                flag=true;
            }
            else
            {
                p[i].left=x-CLR(k,y);
                p[i].right=x+CLR(k,y);
            }
        }
        printf("Case %d: ",tot++);
        if(flag)
        {
            printf("%d\n",-1);
            continue;
        }
        else
        {
            sort(p+1,p+n+1,cmp);
            double ans=p[1].right;
            for(int i=2; i<=n; i++)
            {
                if(p[i].left>ans)
                {
                    sum++;
                    ans=p[i].right;
                }
                else
                {
                    ans=min(ans,p[i].right);
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}
时间: 2024-10-19 03:07:12

【贪心专题】POJ 1328 G - Radar Installation (区间覆盖)的相关文章

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属性

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 【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

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

POJ 1328(Radar Installation)

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

poj1328 Radar Installation 区间贪心

题目大意: 在X轴选择尽量少的点作为圆心,作半径为d的圆.使得这些圆能覆盖所有的点. 思路: 把每个点都转化到X轴上.也就是可以覆盖这个点的圆心的位置的范围[a,b].然后按照每个点对应的a从小到大排序.第一点需要特殊处理,我们赋值r=b0 .也就是使得第一个圆的圆心的横坐标尽量大.然后遍历剩下的点.对于i点,如果该点的ai大于r, 就需要增加一个圆,圆心为bi :否则的话,把r更新为r与bi中小的值. 代码: 1 #include<iostream> 2 #include<cstdio

POJ 2481 树状数组 区间覆盖(POJ2352 Stars 的变形题)(线段化点)

0)学会将题目情景转化为自己熟悉的结构或模型. 题目大意: 每个奶牛有自己的一个区间,求每个奶牛的区间所覆盖的子区间个数(注意,真子集,相等的不算),按照输入的顺序输出. 转化: 要学会将题目情景转化为自己熟悉的模型或结构上.把每个区间的左端x值作为点的x坐标,右端x值作为点的y坐标,就可以把所有区间转化为一个二维坐标图上的点集,而此时每个点左上方的点(同Stars那道题目一样不包括自身)的个数,就是每个区间所覆盖的子区间的个数(对应题目要求,这里或许可以再变形). 同POJ2481 Stars

[ACM] POJ 1328 Radar Installation (贪心,区间选点问题)

Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 51131   Accepted: 11481 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 Radar Installation 【贪心 区间选点】

解题思路:给出n个岛屿,n个岛屿的坐标分别为(a1,b1),(a2,b2)-----(an,bn),雷达的覆盖半径为r 求所有的岛屿都被覆盖所需要的最少的雷达数目. 首先将岛屿坐标进行处理,因为雷达的位置在x轴上,所以我们设雷达的坐标为(x,0),对于任意一个岛屿p(a,b),因为岛屿要满足在雷达的覆盖范围内,所以 (x-a)^2+b^2=r^2,解得 xmin=a-sqrt(r*r-b*b);//即为区间的左端点 xmax=a+sqrt(r*r-b*b);//即为区间的右端点 接下来区间选点即