码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1328 Radar Installation

时间:2018-08-23 00:15:15      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:blank   原因   cstring   lines   mini   mos   width   eve   number   

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

以每个点为圆心画圆,如果和x轴没交点表示没有方案,答案为-1,否则记录与x轴的两个交点(可能是一个,按两个来处理),然后按右交点升序排序,
排着遍历,取出一个圆,然后后面的圆左交点小于等于这个圆的右交点的,都可以用一个雷达感应到。
说一下排序的原因为啥是以右交点升序,而不是降序,也不是以左点,因为是从左往右看,一个点越靠近x轴,那么两交点的距离越大,那么可能他左边有一些点可以共用一个雷达,右边有一些点也可以共用一个雷达,但是这些点都在这个点所成圆的两交点之间,却不能共用一个雷达。
技术分享图片

如图ABC三点,如果按左点排序不管右点,那么如果A点排在前面,BC的左点都不超过A的右点,实际需要两个雷达,显然B要排在前面。

代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define MAX 1001
#define inf 0x3f3f3f3f
using namespace std;
typedef pair<double,double> pa;
int n,num,c;
double r;
pa p[MAX];
bool cmp(pa a,pa b) {
    return a.second < b.second;
}
int main() {
    double a,b;
    while(~scanf("%d%lf",&n,&r) && (n + r)) {
        int flag = 1;
        for(int i = 0;i < n;i ++) {
            scanf("%lf%lf",&a,&b);
            if(fabs(b) > r)flag = 0;
            else {
                double d = sqrt(r * r - b * b);
                p[i].first = a - d;
                p[i].second = a + d;
            }
        }
        if(!flag)c = -1;
        else c = 0;
        if(!c) {
            sort(p,p + n,cmp);
            int i = 0;
            while(i < n) {
                int j = i + 1;
                while(j < n && p[j].first <= p[i].second)j ++;
                c ++;
                i = j;
            }
        }
        printf("Case %d: %d\n",++ num,c);
    }
}

 

poj 1328 Radar Installation

标签:blank   原因   cstring   lines   mini   mos   width   eve   number   

原文地址:https://www.cnblogs.com/8023spz/p/9520912.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!