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;
    }
  • 相关阅读:
    如何评测软件工程知识技能水平?
    创新产品的需求分析:未来的图书会是什么样子?
    案例分析:设计模式与代码的结构特性
    业务领域建模Domain Modeling
    转载:10 Easy Steps to a Complete Understanding of SQL
    二十六个月Android学习工作总结
    android sdk无法更新问题解决
    android中利用view画出一条竖线
    android-Java SoftReference,WeakReference,Direct Reference简介
    Intellij IDEA开发第一个android应用教程
  • 原文地址:https://www.cnblogs.com/qldabiaoge/p/8524706.html
Copyright © 2011-2022 走看看