zoukankan      html  css  js  c++  java
  • poj 1328 Radar Installation

    Radar Installation
    Time Limit: 1000MSMemory Limit: 10000K
    Total Submissions: 51377Accepted: 11527



      思路  : 每一个岛都在X轴上有一个区间能够被雷达覆盖,x1为可覆盖的左端点,x2为可覆盖的右端点,x1,x2关于岛的X对称。
    先对岛以x排序,然后贪心。

    将第一个岛的区间  len[ i ].right与其后的岛与区间len[  k  ].left比假设前者大则继续与后面的比反之则将区间更新到后者的区间范围  此时ans+1(注意假设有岛屿的区间

    len [ k ].right<前者的区间  len[ i ].right 则将区间更新到len[ k ].right)  在继续比下去;

    总之就是让雷达在满足当前情况的前提下尽量往右方。



    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<stdlib.h>
    using namespace std;
    struct Class{
        double x;
        double y;
    }zb[1005];
    
    struct Std{
        double s;
        double e;
    }len[1005];
    double r;
    int ans,n;
    bool cmp(Class a,Class b)
    {
        return a.x<b.x;
    }
    
    void worklen()//将每一个岛屿各自相应的可以放雷达的区域计算出来
    {
        for(int i=0;i<n;i++)
        {
            /*cout<<len[i].s<<" "<<len[i].e<<endl;*/
            len[i].s=zb[i].x-sqrt(r*r-(zb[i].y*zb[i].y));
            len[i].e=zb[i].x+sqrt(r*r-(zb[i].y*zb[i].y));
    
        }
    }
    void work()
    {
        int j;
        int l=0;
    
              for(j=1;j<n;j++)
                 {
                     if(len[j].e<len[l].e)
                     {
                         l=j;//当有第j个岛屿雷达的放置区比l个岛屿的小时 注意要把最小的作为比較标准
                     }
                     else if(len[l].e<len[j].s)
                         {
                            ans++;
                            l=j;
                         }
    
                 }
    
            return ;
    }
    
    int main()
    {
        int i,flag,t=1;
        while(cin>>n>>r,n||r)
        {
    
            flag=0;
            ans=1;
            for(i=0;i<n;i++)
              cin>>zb[i].x>>zb[i].y;
    
                for(i=0;i<n;i++)
                    if(fabs(zb[i].y)>r)
                       {
                           flag=1;
                       }
            if(flag)
                {
                    cout<<"Case "<<t<<": "<<"-1"<<endl;
                    t++;
                }
            else
            {
                sort(zb,zb+n,cmp);
                /*for(i=0;i<n;i++)
                    cout<<zb[i].x<<" "<<zb[i].y<<endl;*/
                worklen();
                work();
                cout<<"Case "<<t<<": "<<ans<<endl;
                t++;
    
            }
    
        }
    
        return 0;
    }
    


  • 相关阅读:
    Linux部署项目因为配置文件导致项目启动失败
    SQL Server数据库安装过程中遇到的问题
    jsp页面提交的时候,浏览器提示未响应,因为脚本长时间运行
    Jquery获取列表中的值和input单选、多选框控制选中与取消
    回调函数的理解历程
    类型转换之转String
    LigerUI开发过程中踩过的坑
    常用方法
    线段树维护区间平均值和方差
    线段树维护区间最大子段和
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4300624.html
Copyright © 2011-2022 走看看