码迷,mamicode.com
首页 > 其他好文 > 详细

poj1328贪心中的区间问题

时间:2016-03-27 18:02:30      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

题意:给定海岛个数、雷达半径以及各海岛坐标,求能覆盖所有海岛的最小雷达数。

思路:先对每个海岛求一个区间:即能覆盖它的所有雷达的圆心所构成的区间。然后对区间排序,定义一个最右点over,依次延伸over,如果over不在某个区间内,那么消耗一颗雷达,over更新为该区间的最右端,否则end更新为起点在over内的所有区间的最小右端点。

技术分享
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
const int maxn=1010;
typedef struct P
{
    double start,over;
}P;
P point[maxn];
bool cmp(P a,P b)
{
    return a.start<b.start;
}
int main()
{
    int n;
    double r;
    int cas=0;
    while(cin>>n>>r)
    {
        if(n==0&&r==0) break;
        int res=0;
        for(int i=0;i<n;i++)
        {
            double x,y;
            cin>>x>>y;
            if(res==-1) continue;
            if(y>r){
                res=-1;
                continue;
            }
            double tt=sqrt(r*r-y*y);
            point[i].start=x-tt;
            point[i].over=x+tt;
        }
        if(res==-1)
        {
            cout << "Case " << ++cas<< ": " << res << endl;
            continue;
        }
        sort(point,point+n,cmp);
        double mi=-0x3ffff;
        for(int i=0;i<n;i++)
        {
            if(mi<point[i].start){
                res++;
                mi=point[i].over;
            }
            else if(mi>point[i].over){
                mi=point[i].over;
            }
        }
        cout << "Case " << ++cas<< ": " << res << endl;
    }
    return 0;
}
我的代码

 

poj1328贪心中的区间问题

标签:

原文地址:http://www.cnblogs.com/wolf940509/p/5325987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!