博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
贪心 POJ 1328 Radar Installation
阅读量:7223 次
发布时间:2019-06-29

本文共 2366 字,大约阅读时间需要 7 分钟。

 

题目地址: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 
13 #include
14 #include
15 #include
16 #include
17 #include
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

你可能感兴趣的文章
centos 最小化安装pycharm
查看>>
IMPROVING IOS UNIT TESTS WITH OCMOCK
查看>>
在客户端显示服务器端任务处理进度条
查看>>
查找最相近的字符串
查看>>
map的运用
查看>>
mybatis--MapperScannerConfigurer
查看>>
【笔记】mysql两条数据的某个属性值互换
查看>>
leetcode—Populating Next Right Pointers in Each Node
查看>>
python发起请求提示UnicodeEncodeError
查看>>
文件夹搜索不能用【弹出意外错误,操作无法实现】如何解决呢
查看>>
C程序的存储空间布局
查看>>
OpenStack 的防火墙规则流程
查看>>
环境变量 安装SU
查看>>
请注意,再次记住, centos7,fedora 24中 没有iptables服务, 而使用的firewalld, 也可以安装 iptables-services程序来实现...
查看>>
Overloading Django Form Fields
查看>>
JVM内幕:Java虚拟机详解
查看>>
An incompatible version 1.1.14 of APR based Apache Tomcat Native library is installed, while Tomcat
查看>>
高并发与负载均衡-nginx-反向代理概念
查看>>
Easyui DataGrid DateRange Filter 漂亮实用的日期区间段筛选功能
查看>>
03.MyBatis的核心配置文件SqlMapConfig.xml
查看>>