贪心 POJ 1328 Radar Installation

 

题目地址:http://poj.org/problem?id=1328

  1 /*
  2     贪心
  3     (转载)题意:有一条海岸线,在海岸线上方是大海,海中有一些岛屿,
  4         这些岛的位置已知,海岸线上有雷达,雷达的覆盖半径知道,
  5         问最少需要多少个雷达覆盖所有的岛屿。
  6     (错误)思路:我开始是想从最左边的点雷达能探测的到的最右的位置出发,判断右边其余的点是否与该点距离小于d
  7         是,岛屿数-1;不是,雷达数+1,继续。。。    
  8     (正确)思路:每个岛屿的座标已知,以雷达半径为半径画圆,与x轴有两个交点。
  9         也就是说,若要覆盖该岛,雷达的位置范围是这两个交点。因此转化为覆盖区间的问题。
 10     参考代码:http://www.cnblogs.com/kuangbin/archive/2011/07/30/2121838.html    
 11 */
 12 #include <cstdio>
 13 #include <iostream>
 14 #include <algorithm>
 15 #include <cstring>
 16 #include <string>
 17 #include <cmath>
 18 using namespace std;
 19 
 20 const int MAXN = 1e3 + 10;
 21 const int INF = 0x3f3f3f3f;
 22 struct NODE
 23 {
 24     int x, y;
 25     double l, r;
 26 }node[MAXN];
 27 
 28 bool cmp(NODE a, NODE b)
 29 {
 30     return a.l < b.l;
 31 }
 32 
 33 bool ok(int n, int d)
 34 {
 35     if (d < 0)    return false;
 36     for (int i=1; i<=n; ++i)
 37     {
 38         if (node[i].y > d)    return false;
 39     }
 40 
 41     return true;
 42 }
 43 
 44 void work(int n, int d)
 45 {
 46     int cnt = 1;
 47     double now = node[1].r;
 48     for (int i=2; i<=n; ++i)
 49     {
 50         if (now > node[i].r)    now = node[i].r;
 51         if (now < node[i].l)
 52         {
 53             now = node[i].r;
 54             cnt++;
 55         }
 56     }
 57     printf ("%d\n", cnt);
 58 }
 59 
 60 int main(void)        //POJ 1328 Radar Installation
 61 {
 62     //freopen ("I.in", "r", stdin);
 63 
 64     int n, d;
 65     int cnt = 0;
 66     while (~scanf ("%d%d", &n, &d) && n && d)
 67     {
 68         for (int i=1; i<=n; ++i)
 69         {
 70             scanf ("%d%d", &node[i].x, &node[i].y);
 71             node[i].l = (double)node[i].x - sqrt ((double)d * d - node[i].y * node[i].y);
 72             node[i].r = (double)node[i].x + sqrt ((double)d * d - node[i].y * node[i].y);
 73         }
 74         sort (node+1, node+1+n, cmp);
 75         printf ("Case %d: ", ++cnt);
 76         if (!ok (n, d))
 77         {
 78             printf ("%d\n", -1);    continue;
 79         }
 80         work (n, d);
 81     }
 82 
 83     return 0;
 84 }
 85 
 86 /*
 87 void work(int n, int d)
 88 {
 89     int i = 1;
 90     int j = 1;
 91     int next = 1;
 92     int num = 0;
 93     int cnt = 0;
 94     while (num < n)
 95     {
 96         double res = node[i].x + sqrt (d * d - node[i].y * node[i].y);
 97         cnt++;    num++;
 98         int flag = 0;
 99         fors (j=i+1; j<=n; ++j)
100         {
101             if (pow (node[j].x - res, 2) + pow (node[j].y, 2) <= d * d)
102             {
103                 num++;    next = j;    flag = 1;
104             }
105         }
106         if (flag)    i = next + 1;
107         else    i++;
108     }
109     printf ("%d\n", cnt);
110 }
111 */

 

转载于:https://www.cnblogs.com/Running-Time/p/4372401.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值