zoukankan      html  css  js  c++  java
  • POJ1328(Greedy,Vector,Sort,Iterator)

    1328:Radar Installation

    时间限制:

    1000ms

    内存限制:

    65536kB

    描述

    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

    输入

    The input consists of several test cases. (1)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 (2)terminated by a line containing pair of zeros

    输出

    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.

    样例输入

    3 2

    1 2

    -3 1

    2 1

     

    1 2

    0 2

     

    0 0

    样例输出

    Case 1: 2

    Case 2: 1

    #include"iostream"
    #include"cmath"
    #include"algorithm"
    #include"vector"
    #include"functional"
    using namespace std;
    class segment
    {
    public:
     int x,y;
     double left,right;
    };
    bool  compare(segment one,segment two)//为sort函数定义比较函数,若从小到大则返回true
     {
      if(one.left<two.left)
       return true;
      else
       return false;
     }
    int main()
    {
     int n,d;
     vector<segment> radar;
     cin>>n>>d;
     int n_case=1;
     int flag;//将flag的声明放在上面,根据试验,相对放在下面循环可以节省10ms的时间
     while(n&&d){
      segment temp;
      flag=1;//注意必须重置flag,否则会出现Output Limit Exceeded
      for(int i=0;i<n;i++)//输入
      {
       cin>>temp.x>>temp.y;
       if(temp.y>d)//判定是否有解
        flag=-1;
       temp.left=temp.x-sqrt(pow((double)d,2.0)-pow((double)temp.y,2.0));
       temp.right=temp.x+sqrt(pow((double)d,2.0)-pow((double)temp.y,2.0));
       radar.push_back(temp);
      }
      
      if(flag==-1)//flag将在上面重置;处理无解的类型和下面的有解情况必须要用if,else来分治,因为后面还要cin>>n>>d
      {
       cout<<"Case "<<n_case<<": "<<flag<<endl;
       radar.clear();
      }
      else
      {
      sort(radar.begin(),radar.end(),compare);//默认从小到大
      temp=radar[0];
      int ans=1;
      for(vector<segment>::iterator i=radar.begin()+1;i!=radar.end();i++)//利用迭代器遍历并修正相关区域范围
      {
       if((*i).left<=temp.right)//区域有交叉,取交集;注意是小于等于符
       {
        if((*i).left>temp.left)//判断左边
        {
         temp.left=(*i).left;
        }
        if((*i).right<temp.right)//判断右边
        {
         temp.right=(*i).right;
        }
       }
       else//无交叉
       {
        ans++;//雷达数加1
        temp=(*i);//temp更新
       }
      }//结束迭代器遍历
      cout<<"Case "<<n_case<<": "<<ans<<endl;
      radar.clear();//注意使用迭代器遍历的时候必须要将radar重置
      }//结束else判断下的有解情况
      n_case++;
      cin>>n>>d;
     }//结束n,d判定的循环
    }

  • 相关阅读:
    男人要知道的40条忠告
    利用xtraBackup实现不停master服务做主从同步
    MY SQL 知识
    房价与阶级
    SQL Server数据库级别触发器
    mysql 5.7开启并行复制
    SQL Server 查出未提交事务(长事务)SQL
    开源数据集
    telnet
    Zend Studio使用综述
  • 原文地址:https://www.cnblogs.com/lzhitian/p/2140071.html
Copyright © 2011-2022 走看看