zoukankan      html  css  js  c++  java
  • POJ:1328-Radar Installation

    Radar Installation

    Time Limit: 1000MS Memory Limit: 10000K

    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.

    这里写图片描述

    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轴上方很多个点,要求用圆心在x轴上半径为r的圆将这些点覆盖,问最少要用多少个圆。这是一个很好的题。

    • 一开始知道这是一个贪心,但是贪心的方法很久都没想到。其实就是先将这些点按照x坐标排序,然后确定第一个点的圆心,然后看第二个点圆能够建立圆心区域的最左边是否在第一个圆心的左边,是则将第二个圆心替换第一个圆的圆心,如果不是就看第二个点是否在第一个圆内,如果在圆内则不用管,不在就需要建一个新的圆来包含这个点,然后依次类推就可以得到最佳答案。输出-1就是y轴上的坐标比给出的r还更大。

    • 还有就是要注意一下浮点数精度的问题。


    #include<stdio.h>
    #include<queue>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    const int maxn = 1010;
    struct node
    {
        int x,y;
    } p[maxn];
    
    bool cmp(node a,node b)
    {
        if(a.x != b.x)
            return a.x < b.x;
        return a.y > b.y;
    }
    
    bool init(int n,int r)
    {
        bool flag = false;
        for(int i=0; i<n; i++)
        {
            scanf("%d%d",&p[i].x,&p[i].y);
            if(p[i].y > r)
                flag = true;
        }
        sort(p,p+n,cmp);
        return flag;
    }
    
    int solve(int n,int r)
    {
        double pre_pos = -100000;
        int ans = 1;
        node now;
        queue<node> qu;
        for(int i=0; i<n; i++)
            qu.push(p[i]);
        pre_pos = 0x7f7f7f7f;
        while(!qu.empty())
        {
            now = qu.front();
            qu.pop();
            double x = now.x + sqrt(r*r - now.y*now.y);
            if(x < pre_pos)//圆心替换
            {
                pre_pos = x;
                continue;
            }
            if((now.x-pre_pos)*(now.x-pre_pos) + now.y*now.y > r*r)//不包含在上一个点的圆内,需要新的圆
            {
                ans++;
                pre_pos = x;
            }
        }
        return ans;
    }
    
    int main()
    {
        int n,r,t = 1;
        while(scanf("%d%d",&n,&r))
        {
            if(n+r == 0)
                return 0;
            bool flag = init(n,r);
            if(flag)
            {
                printf("Case %d: -1
    ",t++);
                continue;
            }
            int ans = solve(n,r);
            printf("Case %d: %d
    ",t++,ans);
        }
    }
    
  • 相关阅读:
    .NET Core 3.0 部署在docker上运行
    Docker 微服务教程
    Docker 入门教程
    快速了解 Linux系统信息
    Navicat 连接本地MS-SQL服务器,只能用localhost无法使用127.0.0.1
    安装Ubuntu Server 18.04 并支持远程方式
    AdventureWorks 安装和配置[转自 微软msdn]
    SQL Server 2014 Agent 无法启动
    微信会死么
    ajax+php数据增加查询获取删除
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107240.html
Copyright © 2011-2022 走看看