zoukankan      html  css  js  c++  java
  • POJ 1328 安装雷达 (贪心)

    <题目链接>

    题目大意:

    以x轴为分界,y>0部分为海,y<0部分为陆地,给出一些岛屿坐标(在海中),再给出雷达可达到范围,雷达只可以安在陆地上,问最少多少雷达可以覆盖所以岛屿

    解题思路:

    以岛屿为圆心r为半径画一个圆(记为圆O),于是只要雷达在这个圆里那么这个岛屿就能被覆盖。而从前面的分析可知,雷达必然要布置在x轴上,所以雷达肯定放在圆O与x轴的那段交线区间上

    所以我们可以将所有的岛屿对应的这段区间记录下来,然后就是将这些区间的右端点从小到大排序,然后就是贪心的从左到右安排雷达,记录当前所安排的最右边的雷达的坐标,然后判断当前区间是否包含这个坐标,如果没有,就在这个区间的右端新建一个雷达。

    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    using namespace std;
    
    const int N = 1e3+5;
    int n,R;
    
    struct Node{
        int x,y;
        double l,r;
        Node(int _x=0,int _y=0):x(_x),y(_y){}
        bool operator < (const Node &tmp)const{
            return r<tmp.r;     //按r排序
        }
    }node[N];
    
    int main(){
        int ncase=0;
        while(~scanf("%d%d",&n,&R),n||R){
            bool fp=true;
            for(int i=1;i<=n;i++){
                scanf("%d%d",&node[i].x,&node[i].y);
                if(node[i].y>R)fp=false;
                double tmp=(double)sqrt(R*R*1.0-node[i].y*node[i].y*1.0);     //得到如果要覆盖这个点的话,雷达所需呀在的区域
                node[i].l=(double)(node[i].x-tmp);node[i].r=(double)(node[i].x+tmp);
            }if(!fp){ printf("Case %d: -1
    ",++ncase);continue; }
            sort(node+1,node+1+n);
            double loc=node[1].r;int ans=1;
            for(int i=2;i<=n;i++){    
                if(node[i].l>loc)ans++,loc=node[i].r;
            }
            printf("Case %d: %d
    ",++ncase,ans);
        }
    }


    作者:is_ok
    出处:http://www.cnblogs.com/00isok/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    深入理解计算机系统 第七章
    第七周 可执行程序的卸载
    Linux内核设计与实现 第三章
    第六周 进程的描述和进程的创建
    第五周 扒开系统调用的三层皮(下)
    UIWebView和Js交互
    CocoaPods的版本升级
    ios图片添加文字或者水印
    Objective-C 关联
    NSString进行urlencode编码
  • 原文地址:https://www.cnblogs.com/00isok/p/8687949.html
Copyright © 2011-2022 走看看