zoukankan      html  css  js  c++  java
  • poj 1328 Radar Installation

    题目链接:http://poj.org/problem?id=1328

    Radar Installation
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 67443   Accepted: 15121

    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

     
    题意: 输入n,d,表示有n个点,半径为d,接下来输入n行,表示n个点的坐标,最少需要几个才能将所有点包围。
     
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    
    using namespace std;
    
    struct node
    {
        double x,y;
    } a[1005];
    
    struct len
    {
        double l, r;
    } ans[1005];
    
    bool cmp(len x1, len x2)
    {
        if(fabs(x1.l-x2.l)<1e-10)
            return x1.r < x2.r;
        return x1.l < x2.l;
    }
    
    int main()
    {
        int n;
        double d;
        int k=1;
        while(scanf("%d%lf",&n, &d),n+d)
        {
            int flag = 0;
            for(int i=0; i<n; i++)
            {
                scanf("%lf%lf",&a[i].x,&a[i].y);
                if(a[i].y-d > 1e-10)
                {
                    flag = 1;
                }
            }
            int s = 1;
            if(flag)
                s=-1;
            else
            {
                for(int i=0; i<n; i++)
                {
                    double l = sqrt(pow(d,2) - pow(a[i].y,2));
                    ans[i].l = a[i].x - l;
                    ans[i].r = a[i].x + l;
                }
                sort(ans, ans+n, cmp);
    
                double R = ans[0].r;
                for(int i=1; i<n; i++)
                {
                    if(ans[i].l-R > 1e-10)
                    {
                        s++;
                        R = ans[i].r;
                    }
                    else
                    {
                        R = min(R, ans[i].r);
                    }
                }
            }
            printf("Case %d: %d
    ",k++,s);
        }
    
        return 0;
    }
  • 相关阅读:
    Linux——shell简单学习(一)
    Linux——进程管理简单学习笔记(二)
    Linux——进程管理学习简单笔记
    Linux——用户管理简单学习笔记(四)
    PHP计算程序运行时间的类
    php几个常用的概率算法(抽奖、广告首选)
    限制非安全IP访问
    简单的点击短信发送计时器
    php 以图搜图
    递归获取二维数组后代、删除后代
  • 原文地址:https://www.cnblogs.com/mengzhong/p/5038761.html
Copyright © 2011-2022 走看看