poj1328贪心中的区间问题

Posted wolf940509

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1328贪心中的区间问题相关的知识,希望对你有一定的参考价值。

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

思路:先对每个海岛求一个区间:即能覆盖它的所有雷达的圆心所构成的区间。然后对区间排序,定义一个最右点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贪心中的区间问题的主要内容,如果未能解决你的问题,请参考以下文章

贪心-poj1328

[ACM] POJ 1328 Radar Installation (贪心,区间选点问题)

POJ 1328 Radar Installation (区间贪心)

POJ1328

POJ1328 Radar Installation 贪心&#183;区间选点

POJ #1328 Radar Installation 区间贪心 数学题(雾