• poj 1328 Radar Installation(贪心)


    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

    贪心。

    一开始的思路:

    图中ABCD为海岛的位置。假设本题半径为2(符合坐标系),那么A点坐标为(1,1)以此类推。

    在题中,记录每个点的坐标,并把一个点新加一个标记变量以标记是否被访问过。

    首先以A为圆心,r为半径做圆,交x轴与E1(右)点,做出如图中绿色虚线圆。然后以E1为圆心,半径为r做圆。看此时下一点(B)是否在该圆中。如果在,那么将该点标记变量变为true,再判下一点(C),如果不在那么就新增一个雷达。

    后来,换了思路,存储图中红色圆与X轴的交点。

    还是原来的贪心思路,仍然先排序,但排序的准则是按红色圆与x轴左交点的先后顺序。

    如图,如果B点圆(且如此称呼)的左交点(J1点)在A点圆右交点(E1)左侧,那么B点一定涵盖在A点圆内部。再如图,如果D点圆的左交点(图中未标示)在A点圆的右交点(未标示)右,则D点不在A点圆中。

    故,有如下代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<cmath>
     7 using namespace std;
     8 struct Node
     9 {
    10     double left,right;
    11 }p[1006];
    12 bool cmp(Node a,Node b)
    13 {
    14     return a.left<b.left;
    15 }
    16 int main()
    17 {
    18     int n;
    19     double r;
    20     int ac=0;
    21     while(scanf("%d%lf",&n,&r)==2 && (n || r))
    22     {
    23         int f=1;
    24         for(int i=0;i<n;i++)
    25         {
    26             double a,b;
    27             scanf("%lf%lf",&a,&b);
    28             if(b>r)
    29             {
    30                 f=0;
    31             }
    32             else 
    33             {
    34                 p[i].left=a-sqrt(r*r-b*b);
    35                 p[i].right=a+sqrt(r*r-b*b);    
    36             }
    37         }
    38         printf("Case %d: ",++ac);
    39         if(f==0)
    40         {
    41             printf("-1
    ");
    42             continue;
    43         }
    44         sort(p,p+n,cmp);
    45         int ans=1;
    46         Node tmp=p[0];
    47         for(int i=1;i<n;i++)
    48         {
    49             if(p[i].left>tmp.right)
    50             {
    51                 ans++;
    52                 tmp=p[i];
    53             }
    54             else if(p[i].right<tmp.right)
    55             {
    56                 tmp=p[i];
    57             }
    58         }
    59         printf("%d
    ",ans);
    60         
    61     }
    62     return 0;
    63 }
    View Code
  • 相关阅读:
    params可变参数
    using释放资源
    第二章:深入C#数据类型
    体检套餐项目解析
    堆栈
    C#必看:《第17章节QQ管理系统》
    C#必看:《第15章节学生管理系统》
    ACM hdu 1008 Elavator
    jq尺寸和位置总结篇(width scrollTop position offset)
    find children slice
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/4762144.html
Copyright © 2020-2023  润新知