zoukankan      html  css  js  c++  java
  • 贪心——D

    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
    


    题目大意:
    就是给你n组数据和圆的半径d,让你在x轴上画半径为d的圆,问:如果将所有的点都画进去,最少需要多少个圆,这个题目和导弹拦截有点像,不过更加简单

    思路:
    就是先判断d是不是大于等于0,如果d<0,肯定是输出-1的,
    之后输入数字,如果有坐标的纵坐标比d还要大,那么也是不对的也要输出-1
    之后对坐标进行处理,把每一个坐标在x轴上的范围标记出来,并进行排序,先排右边的位置,右边位置越小就排在越前面,因为我们是要从横坐标左边往右边排
    如果右边相同,就排左边,左边大的先排,因为区间范围小的肯定可以把区间范围大的包括进去,反之则不行。
    排完序之后
    就开始画圈圈。



    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <algorithm>
    #include <math.h>
    #include <iostream>
    using namespace std;
    const int maxn=1010;
    struct node
    {
        double l,r;
    }exa[maxn];
    bool cmp(node a,node b)
    {
        if(a.r==b.r) return a.l>b.l;
        return a.r<b.r;
    }
    
    int main()
    {
        int n,cnt=0;;
        double d,a,b;
        while(scanf("%d%lf",&n,&d)!=EOF&&(n+d))
        {
            bool flag=0;
            if(d>=0) flag=1;
            for(int i=0;i<n;i++)
            {
                scanf("%lf%lf",&a,&b);
                if(b>d) flag=0;
                if(flag)
                {
                    exa[i].l=a-sqrt(d*d-b*b);
                    exa[i].r=a+sqrt(d*d-b*b);
                }
            }
            sort(exa,exa+n,cmp);
            int ans=-1;
            if(flag)
            {
                ans=1;
                double maxr=exa[0].r;
                for(int i=1;i<n;i++)
                {
                    if(exa[i].l>maxr)
                    {
                        ans++;
                        maxr=exa[i].r;
                    }
                }
            }
            cout << "Case " << ++cnt << ": " << ans << endl;
        }
        return 0;
    }
    

      











  • 相关阅读:
    数据类型及用法
    NFS与SSH
    nginx服务,nginx反向代理
    rpm软件包管理
    磁盘分区,文件系统,软链接和硬链接,内存和进程管理
    Linux常用命令,文件目录和权限管理
    操作系统与网络协议(day3)
    计算机基础之硬件简介(Day2)
    QT写串口
    485传输
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/10359199.html
Copyright © 2011-2022 走看看