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
  • 相关阅读:
    JavaScript实现类的private、protected、public、static以及继承
    OSS网页上传和断点续传(STSToken篇)
    OSS网页上传和断点续传(OSS配置篇)
    Linq sum()时遇到NULL
    SQLSERVER事务日志已满 the transaction log for database 'xx' is full
    笔记本高分辨软件兼容问题,字体太小或模糊
    H5上传图片之canvas
    An error occurred while updating the entries. See the inner exception for details.
    无限级结构SQL查询所有的下级和所有的上级
    SQLserver 进程被死锁问题解决
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6308985.html
Copyright © 2011-2022 走看看