zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    自考新教材-p240_2
    自考新教材-p243_5_(1)
    自考新教材-p242_4
    自考新教材-p233
    自考新教材-p230
    Spring入门(9)-AOP初探
    MongoDB的备份与恢复
    JVM基础知识(1)-JVM内存区域与内存溢出
    Spring入门(8)-基于Java配置而不是XML
    Spring入门(7)-自动检测Bean
  • 原文地址:https://www.cnblogs.com/csnd/p/12062453.html
Copyright © 2011-2022 走看看