• POJ


    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
    题意:假定海岸线是无限长的直线。陆地位于海岸线的一侧,海洋位于另一侧。每个小岛是位于海洋中的一个点。对于任何一个雷达的安装 (均位于海岸线上),只能覆盖 d 距离,因此海洋中的小岛被雷达安装所覆盖的条件是两者间的距离不超过 d 。 
    我们使用卡笛尔坐标系,将海岸线定义为 x 轴。海洋的一侧位于 x 轴上方,陆地的一侧位于下方。给定海洋中每个小岛的位置,并给定雷达安装的覆盖距离,您的任务是写一个程序,找出雷达安装的最少数量,使得所有的小岛都被覆盖。注意:小岛的位置以它的 x-y 坐标表示。

    题解:这道题乍一看没有思路,但是如果不从雷达考虑,从小岛考虑,那么每个小岛都有一个对应的覆盖区间,只有区间内的点才能覆盖这个岛,所以问题变成了区间选点
    只是要注意,精度是double的

    代码:
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    struct node
    {
        double l,r;
    } a[1010];
    
    int x[1010],y[1010];
    int n,d,cnt,t=0;
    
    bool cmp(node a,node b)
    {
        return a.l<b.l;
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&d)!=EOF&&n)
        {
            t++;
            int flag=0;
            cnt=1;
            if(d<=0)
            {
                flag=1;
            }
            for(int i=1; i<=n; i++)
            {
                scanf("%d%d",&x[i],&y[i]);
                if(y[i]>d||y[i]<0)
                {
                    flag=1;
                }
                double dr=sqrt((double)d*d-y[i]*y[i]);
                a[i].l=x[i]-dr;
                a[i].r=x[i]+dr;
            }
    
            if(flag==1)
            {
                printf("Case %d: -1
    ",t);
                continue;
            }
            sort(a+1,a+n+1,cmp);
            double lim=a[1].r;
            for(int i=2; i<=n; i++)
            {
                if(a[i].l>lim)
                {
                    lim=a[i].r;
                    cnt++;
                }
                else
                {
                    if(a[i].r<lim)
                    {
                        lim=a[i].r;
                    }
                }
            }
            printf("Case %d: %d
    ",t,cnt);
        }
    
    }













  • 相关阅读:
    网络流模型之二分图匹配问题
    省选测试8
    省选测试9
    省选测试7
    省选测试6
    网络流最大流、最小割学习笔记
    kruskal重构树学习笔记
    省选测试5
    Python 打包成exe 方式
    JQuery
  • 原文地址:https://www.cnblogs.com/stxy-ferryman/p/8429961.html
Copyright © 2020-2023  润新知