POJ1328贪心放雷达

来源:互联网 发布:小提琴 曲 知乎 编辑:程序博客网 时间:2024/04/29 01:48
题意: 
      有一个二维坐标,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 + 10using 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\n");            continue;        }        if(jude2)        {            printf("-1\n");            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\n" ,ansSum);    }    return 0;}


0 0