• 【贪心】poj1328:雷达设置


    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

    解题思路:该题题意是为了求出能够覆盖所有岛屿的最小雷达数目,每个小岛对应x轴上的一个区间,在这个区间内的任何一个点放置雷达,则可以覆盖该小岛,区间范围的计 算用[x-sqrt(d*d-y*y),x+sqrt(d*d-y*y)];这样,问题即转化为已知一定数量的区间,求最小数量的点,使得每个区间内斗至少存在一个点。每次迭代对于第一个区间,选 择最右边一个点, 因为它可以让较多区间得到满足, 如果不选择第一个区间最右一个点(选择前面的点), 那么把它换成最右的点之后,以前得到满足的区间, 现在仍然 得到满足, 所以第一个区间的最右一个点为贪婪选择, 选择该点之后, 将得到满足的区间删掉,进行下一步迭代, 直到结束。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <algorithm>
     5 #include <math.h>
     6 using namespace std;
     7 struct node
     8 {
     9     double l,r;
    10 };
    11 node a[1005];
    12 bool cmp(node a,node b)
    13 {
    14     return a.r<b.r;
    15 }
    16 int main()
    17 {
    18     int n,k=1;
    19     int flag;
    20     double d;
    21     while(cin>>n>>d)
    22     {
    23         flag=1;
    24         if(n==0&&d==0)
    25         {
    26             break;
    27         }
    28         double x,y;
    29         for(int i=0;i<n;i++)
    30         {
    31             cin>>x>>y;
    32             if(!flag)
    33             {
    34                 continue;
    35             }
    36             if(y>d)
    37             {
    38                 flag=0;
    39                 continue;
    40             }
    41             a[i].l=x-sqrt(d*d-y*y);
    42             a[i].r=x+sqrt(d*d-y*y);
    43         }
    44         printf("Case %d: ", k++);
    45         if(!flag)
    46         {
    47             printf("-1
    ");
    48             continue;
    49         }
    50         sort(a,a+n,cmp);
    51         double temp=-10000;
    52         int ans=0;
    53         for(int i=0;i<n;i++)
    54         {
    55             if(temp<a[i].l)
    56             {
    57                 ans++;
    58                 temp=a[i].r;
    59             }
    60         }
    61         cout << ans << endl;
    62     }
    63 
    64     return 0;
    65 }
    View Code
  • 相关阅读:
    sql sever外网映射后链接,端口号用,号区分
    zentao事故,慢sql查询
    阿里云镜像加速器配置
    对产品不同指标维度分组求和
    burp抓包https请求
    mysql获取当天,昨天,本周,本月,上周,上月的起始时间
    查询不同sql,插入同一个sheet
    按分类查找缺陷并输出到EXCEL
    循环导出所有行和列
    查询某字段等于当天的日期sql:select count(*) from zt_bug WHERE date_format(openedDate,'%Y-%m-%d')=date_format(NOW(),'%Y-%m-%d')
  • 原文地址:https://www.cnblogs.com/SoulSecret/p/8425976.html
Copyright © 2020-2023  润新知