POJ1328贪心放雷达

题意: 
      有一个二维坐标,y>0是海,y<=0是陆地,然后只能在y=0的岸边上放雷达,有n个城市需要被监控,问最少放多少个雷达。


思路:

      贪心去做就行了,其实题目不难但是这个题目过的并不怎么顺利,哎!,一开始我的想法是按照x排序,然后从左往右一个一个放置雷达,第一个放在第一个点相切的右侧,....结果果断wa了,然后就又想到可以求出每个城市的可放置区间,然后去贪心,还是wa了,原因是排序的时候还是按照x从小到大排序的,后来看了讨论区一眼,才把排序是按照左区间排序的,一开始隐约考虑过这个,但是感觉按照x排没有错(一开始的想法),还有就是这个题目的数据比较坑人,要考虑d是负数或者y是负数的情况,如果全面的想,d是负数的话,如果所有的y都<=0那么输出0,否则就输出-1,如果y有大于0的,同时最大的y比b大,那么就输出-1,然后就是正常贪心,贪心的时候遇到y<0的点直接跳过去不考虑,有点小坑啊,不过是一个不错的简单题。


#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>

#define N 1000 + 10

using namespace std;

typedef struct
{
    double l ,r;
    int id;
}REG;

REG reg[N];
int mark[N];

bool camp(REG a ,REG b)
{
    return a.l < b.l;
}


double minn(double x ,double y)
{
    return x < y ? x : y;
}

double maxx(double x ,double y)
{
    return x > y ? x : y;
}

int main ()
{
    int n ,l ,i ,d ,x ,y ,cas = 1;
    while(~scanf("%d %d" ,&n ,&d) && n + d)
    {
        int jude1 = 0 ,jude2 = 0;
        memset(mark ,0 ,sizeof(mark));
        for(i = 1 ;i <= n ;i ++)
        {
            scanf("%d %d" ,&x ,&y);
            if(y > 0) jude1 = 1;
            if(y > d) jude2 = 1;
            reg[i].l = x - sqrt(d * d * 1.0 - y * y * 1.0);
            reg[i].r = x + sqrt(d * d * 1.0 - y * y * 1.0);
            reg[i].id = i;
            if(y <= 0) mark[i] = 1;
        }

        printf("Case %d: " ,cas ++);
        if(!jude1)
        {
            printf("0
");
            continue;
        }

        if(jude2)
        {
            printf("-1
");
            continue;
        }

        double nowxl ,nowxr;
        int ansSum = 0;
        sort(reg + 1 ,reg + n + 1 ,camp);
        for(i = 1 ;i <= n; ++i)
        {
            if(mark[reg[i].id]) continue;
            if(i == 1 || reg[i].l > nowxr)
            {
                ansSum ++;
                nowxl = reg[i].l;
                nowxr = reg[i].r;
            }
            else
            {
                nowxl = maxx(nowxl ,reg[i].l);
                nowxr = minn(nowxr ,reg[i].r);
            }
        }
        printf("%d
" ,ansSum);
    }
    return 0;
}


原文地址:https://www.cnblogs.com/csnd/p/12062453.html