zoukankan      html  css  js  c++  java
  • poj 1328 安雷达问题 贪心算法

    题意:雷达如何放置?在xoy二维平面坐标系里面,x轴上方的为岛屿,x轴下方的是雷达要放到位置,如何放使得雷达放的最少?

    思路

    1. 肯定放在x轴上减少浪费是最好的选择
    2. 什么情况下,雷达无法到达呢?--以这个岛屿为圆心,d为半径,如果这个圆与x轴没有交点的话,就是无法覆盖到---即y>d
    3.   现在就可以这么想了,每个岛屿都当成圆心C,然后都取画圆,跟x轴的交点例如交点A,B.如果雷达放到AB之间那就是可以将刚才C覆盖住了。--转为区间贪心问题

    区间贪心问题:

    1. 先将各个区间的左端点按照从小到大排序
    2. 然后按递增序列开始选取区间,有两种情况 实例说明

    pos---为当前位置 lefe,right分别为当前区间的左右端点

    if(pos<left){ num++;pos=right;}

    if(pos>right) {pos=right;}

    注:针对本题num为雷达的数量

    数学方法

    C(x,y) 圆的方程(X-x)^2+(Y-y)^2=d^2   与x轴的交点为 x+根号(d^2-y^2) ,x-根号(d^2-y^2)

    解题代码:

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <math.h>
    using namespace std;
    typedef struct Node
    {
        double left, right;
    }node;
    int cmp(node a, node b)
    {
        return a.left < b.left;
    }
    int x[2100], y[2100];
    node dis[2100];
    int main()
    {
        int n, d;
        double z;
        int ans = 0;
        while (scanf("%d%d", &n, &d) != EOF)
        {
            if (n == 0 && d == 0)
                break;
            else
            {
                int flag = 1;
                ans++;
                for (int i = 0; i < n; i++)
                {
                    scanf("%d%d", &x[i], &y[i]);
                    if (y[i] > d)
                        flag = 0;
                    else
                    {
                        z = sqrt(d*d*1.0 - y[i] * y[i] * 1.0);
                        dis[i].left = x[i] - z;
                        dis[i].right = x[i] + z;
                    }
                }
                if (!flag)
                {
                    printf("Case %d: -1
    ", ans);
                }
                else
                {
                    sort(dis, dis + n, cmp);
                    int num = 0;
                    double p = -1000000;
                    for (int i = 0; i < n; i++)
                    {
                        if (dis[i].left > p)
                        {
                            num++;
                            p = dis[i].right;
                        }
                        else if (dis[i].right < p)
                        {
                            p = dis[i].right;
                        }
                    }
                    printf("Case %d: %d
    ", ans, num);
                }
            }
        }
        return 0;
    }
    君子知命不惧,自当日日自新
  • 相关阅读:
    HDU 5835 Danganronpa(弹丸论破)
    HDU 5813 Elegant Construction(优雅建造)
    HDU 5831 Rikka with Parenthesis II(六花与括号II)
    HDU 5810 Balls and Boxes(盒子与球)
    HDU 5818 Joint Stacks(联合栈)
    Dream Team(最小生成树)
    带权并查集
    HDU 1495 非常可乐(BFS)
    I Hate It(线段树+更新)
    Just a Hook(线段树+区间更新)
  • 原文地址:https://www.cnblogs.com/xuxiaojin/p/9400645.html
Copyright © 2011-2022 走看看