zoukankan      html  css  js  c++  java
  • POJ 1328 Radar Installation

    http://poj.org/problem?id=1328

    //第一次:从左边第一个未被覆盖的island开始 -->>失败 因为还有y坐标这一因素 不能保证贪心
    //第二次:找两个点 确定一个圆 ----->>>其实早就应该发现错误 漏洞百出 不具有普遍性
    //从左边第一个未覆盖的点作为基点 找到第一个 y坐标>=的点(如果没有找到) 做这两个点的公共圆
    //如果不能做这两个点的公共圆 或者 没有y>=的点 那么做这个圆的右极限圆
    //更新覆盖的点
    //蠢-->>

    //最终策略:把注意力全部集中在x轴上 , 对每个island 作为圆心 交在x轴上有一个区间 那么radar在这个区间内都可以覆盖这个岛屿
    //所以讲所有岛屿的左区间进行排序 区间重叠的共用一个radar
    //思路一错 全盘否定

    网上题解盗一张图说明

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <stdio.h>
     4 #include <algorithm>
     5 #include <math.h>
     6 using namespace std;
     7 
     8 struct Island
     9 {
    10     int x,y;
    11     double limit_l, limit_r;
    12     bool cover;
    13     bool operator < (Island a) const
    14     {
    15         return limit_l < a.limit_l;//按左区间排序
    16     }
    17 }island[1024];
    18 int N, d;
    19 
    20 int solve()
    21 {
    22     double limit_l, limit_r;
    23     int cnt = 1;
    24     if (!N) return 0;//如果N==0
    25     for (int i = 0; i < N; i++)
    26     {
    27         island[i].limit_l = island[i].x - sqrt( d*d - island[i].y*island[i].y );
    28         island[i].limit_r = island[i].x + sqrt( d*d - island[i].y*island[i].y );
    29     }
    30     sort(island, island+N);//按照左区间排序
    31     limit_l = island[0].limit_l;//这里最后忘了初始化 然后挂了
    32     limit_r = island[0].limit_r;
    33     for(int  i = 1; i < N; i++)
    34     {
    35         //cnt++;//第一个雷达
    36         if (island[i].limit_l > limit_r)
    37         {
    38             cnt++;
    39             limit_l = island[i].limit_l;
    40             limit_r = island[i].limit_r;
    41         }
    42         else if (island[i].limit_r < limit_r)
    43         {
    44             limit_r = island[i].limit_risland[i].x - sqrt( d*d island[i].y*island[i].y );
    45         }
    46     }
    47     return cnt;
    48 }
    49 int main()
    50 {
    51     freopen("in.txt", "r", stdin);
    52     bool fail = false;
    53     int Case = 0;
    54     while (~scanf("%d%d",&N, &d))
    55     {
    56         if (N == 0 && d == 0) break;
    57         getchar();//空行
    58         fail = false;//失败的标志
    59         Case++;
    60         for (int i = 0;i < N; i++)
    61         {
    62             scanf("%d%d", &island[i].x, &island[i].y);
    63             if ( island[i].y > d || island[i].y < 0)
    64             {
    65                 fail = true;
    66             }
    67         }
    68         if (fail) printf("Case %d: %d
    ",Case, -1);
    69         else   printf("Case %d: %d
    ", Case, solve());
    70     }
    71     return 0;
    72 }
    View Code
  • 相关阅读:
    JAVA多线程知识点
    RabbitMQ和Springboot集成RabbitMQ知识点
    JAVA动态代理cglib或jdk
    [转]解决System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到的问题的一个方向
    [转]C#判断文档编码格式,并读取文档数据(防止出现乱码)
    create_linux命令写入到sh脚本并删除
    cmd cd切换到d盘
    sql 优化前后
    LISTAGG()WITHIN GROUP()
    使用shell递归遍历文件并打印所有文件名的绝对路径
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6308985.html
Copyright © 2011-2022 走看看