贪心算法解决最少圆覆盖最多点问题

灯塔的游戏

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)

Total Submission(s) : 19   Accepted Submission(s) : 6

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

某学长最近迷上了一个灯塔的游戏,规则如下:
在一个二维的平面里,x轴与y轴划分,x轴上可以放置灯塔,这个二维的平面上存在恶魔队伍,
他们可以在二维平面上的任意的位置!!!你需要做的就是监听到他们的情况!!!
只能在x轴上(x,0)建立灯塔去监控所以的敌方队伍,一定是所有的队伍!!!
请你计算出最少的灯塔数,可以完成监听所以的恶魔队伍。

Input

先输入一个整数t(0 对于每组测试数据
第一个输入整数n,d; n表示的是恶魔的队伍数量,d表示的是灯塔监听的距离 1<=n,<=1000;0<=d<=1000;
接下来n行,有两个整数:a,b。代表的是每个恶魔队伍的位置。 -1000<=a,b<=1000;

Output

对于每组样例,你需要帮助某学长计算出最少的灯塔数,保证可以监控所以敌方队伍。如果无法监视所有敌方队伍,输出-1

Sample Input

2
3 2
1 2
3 1
2 1

3 2
1 1
2 2
0 0

Sample Output

Case 1: 2
Case 2: 1

AC:

#include
using namespace std;

const double ZERO=1e-6;

struct node
{
    double l,r;
    friend bool operator <(node a,node b)
    {
        return a.l>t;
    while(t--)
    {
        node em[1005];
        flag=0;
        cin>>n>>d;
        for(int i=0;i>x>>y;
            if(y>d)
                flag=1;
            em[i].l=x-sqrt(d*d-y*y);
            em[i].r=x+sqrt(d*d-y*y);
        }
        if(flag)
            printf("Case %d: -1\n",cas++);
        else {
            sort(em,em+n);
            sum=1;
            double x=em[0].r;
            for(int i=1;ix+ZERO)
                {
                    sum++;
                    x=em[i].r;
                }
                else if(em[i].r

 

你可能感兴趣的:(贪心,计算几何)