zoukankan      html  css  js  c++  java
  • Radar Installation POJ

    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

    该题题意是为了求出能够覆盖所有岛屿的最小雷达数目

    这题一开始根本没有贪心思路,想不到

    qu[i].left=x-sqrt(r*r-y*y);
    qu[i].right=x+sqrt(r*r-y*y);

    转化为一个区间问题。

    关于这个的合理性 你们画个图就好了 ,表示不会电脑画图

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #include<cctype>
    using namespace std;
    struct node
    {
        double left,right;
    }qu[1010];
    int cmp(node a,node b)
    {
        return a.right<b.right;
    }
    int main() {
        int n,k=1;
        double r;
        while(scanf("%d%lf",&n,&r)!=EOF){
            if (n==0 && r==0 ) break;
            int flag=1;
            double x,y;
            for (int i=0 ;i<n ;i++){
                scanf("%lf%lf",&x,&y);
                if (!flag) continue;
                if (y>r) {
                    flag=0;
                    continue;
                }
                qu[i].left=x-sqrt(r*r-y*y);
                qu[i].right=x+sqrt(r*r-y*y);
            }
            sort(qu,qu+n,cmp);
            printf("Case %d: ",k++);
            if (!flag) {
                printf("-1
    ");
                continue;
            }
            int sum=0;
            double temp=-10000000;
            for (int i=0 ; i<n ;i++){
                if (qu[i].left>temp){
                    sum++;
                    temp=qu[i].right;
                }
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
  • 相关阅读:
    读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define
    读书笔记_代码大全_第14章_组织直线型代码_第15章_使用条件语句
    读书笔记_代码大全_第31章_布局与风格
    读书笔记_代码大全_第16章_控制循环
    读书笔记_Effective_C++_条款五:了解C++默默编写并调用哪些函数
    python学习笔记(三)——字符串
    python学习笔记(六)——函数
    Windows下安装Django
    python小专题——time模块
    python学习笔记(四)——数据字典
  • 原文地址:https://www.cnblogs.com/qldabiaoge/p/8524706.html
Copyright © 2011-2022 走看看