• 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(上)this和对象原型(二)
    hihocoder 1566 皇室成员的名字
    csu 1756: Prime
    csu 1770: 按钮控制彩灯实验
    csu 1898: 复盘拉火车
    csu 1901: 赏赐 OR 灾难
    csu 1909: Perfect Chocolate
    csu 1958: 数字游戏
    symfony2 环境搭建笔记
    php preg_match($p, $str, $match)方法简介
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6308985.html
Copyright © 2020-2023  润新知