zoukankan      html  css  js  c++  java
  • UVALive

    原题:

    Description

    Download as PDF

    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.

    epsfbox{p2519.eps}

    Input

    The input consists of several test cases. The first line of each case contains two integers n (1$ le$n$ le$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 nlines 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
    

    题意:

    给出一个坐标轴, y的正半轴是海, 负半轴是大陆, x轴是海岸线;

    然后在海上有很多海岛, 需要雷达监控, 现在的问题是, 至少需要多少个雷达, 能全部覆盖这些海岛?

    分析:可以化解成区域选最少点问题,注意装换ok

    代码:

    #include<iostream>
    #include<iomanip>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    
    struct node
    {
        double x, y;
        bool operator <(node &b)const
        {
            return y<b.y || (y == b.y&&x>b.x);
        }
    }point[1000+10];
    int main()
    {
        int n, d;
        double x, y;
        int kase = 0;
        while (cin >> n >> d&&n != 0 && d != 0)
        {
            kase++;
            int ok = 1;
            int cnt = 0; 
            for (int i = 0; i < n; i++)
            {
                scanf("%lf%lf", &x, &y);
                if (y>d){
                    ok = 0;
                }
                else{
                    point[i].x = x - sqrt(d*d - y*y);
                    point[i].y = x + sqrt(d*d - y*y);
                }
                
            }
            getchar();
    
            sort(point, point + n);
            double end;
            for (int i = 0; i < n; i++)
            {
                if (i == 0){
                    end = point[i].y;
                    continue;
                }
                if (end < point[i].x){
                    end = point[i].y;
                    cnt++;
                }
    
            }
            if (ok == 0){
                printf("Case %d: -1
    ", kase);
            }
            else{
                printf("Case %d: %d
    ",kase, cnt + 1);
            }
    
        }
        
    
        return 0;
    }
  • 相关阅读:
    yzoj P2344 斯卡布罗集市 题解
    yzoj P2350 逃离洞穴 题解
    yzoj P2349 取数 题解
    JXOI 2017 颜色 题解
    NOIP 2009 最优贸易 题解
    CH 4302 Interval GCD 题解
    CH4301 Can you answer on these queries III 题解
    Luogu2533[AHOI2012]信号塔
    Luogu3320[SDOI2015]寻宝游戏
    Luogu3187[HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/shawn-ji/p/4711862.html
Copyright © 2011-2022 走看看