POJ 1328 Radar Installation

题意: 海上有一些岛屿(数目为n),需要在岸边(x 轴)修建一些雷达站覆盖这些岛屿,雷达的覆盖范围是d , 求最少需要多少雷达。

思路:求出每个岛屿能被雷达覆盖的,雷达可以放置的最左边和最右边位置,然后将每个岛屿按照左边的位置排序,放置雷达。

 

10955167 NY_lv10 1328 Accepted 300K 47MS C++ 1092B 2012-10-25 18:45:07

 

View Code
#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
struct point{
    int x,y;
    double l,r;
};
vector<point> pt;

int r,n;

bool cmp(point p1,point p2)
{
    return p1.l<p2.l;
}
int main()
{
    int i,sum,cases=0;
    //double loc;
    point tmp;
    bool flags=false;
    while(cin>>n>>r&&n||r)
    {
        sum=0;flags=false;pt.clear();
        for( i=0;i<n;i++)
        {
            cin>>tmp.x>>tmp.y;
            if(tmp.y>0)
                pt.push_back(tmp);
            if(tmp.y>r)flags=true;
        }
        if(flags||r<0)
        {
            cout<<"Case "<<++cases<<": -1"<<endl;
            continue;
        }
    
        for(i=0;i<pt.size();i++)
        {
            pt[i].l= pt[i].x- sqrt((double)r*r-pt[i].y*pt[i].y);
            pt[i].r= pt[i].x-pt[i].l+ pt[i].x;
        }
        sort(pt.begin(),pt.end(),cmp);
        i=0;
        while(i<pt.size())
        {
            tmp=pt[i++];
            sum++;
            while(i<pt.size()&&pt[i].l<=tmp.r&&tmp.l<=pt[i].l)   //注意范围是不断的缩小的左右判断
            {                                                    //tmp.l <=pt[i].l <= tmp.r
                tmp.l=pt[i].l;
                if(pt[i].r-tmp.r<1e-8)
                    tmp.r=pt[i].r;
                i++;
            }
        }
        cout<<"Case "<<++cases<<": "<<sum<<endl;
        
    }
    return 0;
}

 

 

posted @ 2012-10-25 18:50  旅行的蜗牛  阅读(137)  评论(0编辑  收藏  举报