【原创】【区间上的贪心 第一篇】Poj 1328 Radar Installation
来源:互联网 发布:ubuntu chmod 755 编辑:程序博客网 时间:2024/05/17 22:56
区间上的各种贪心
不多说,看题。
选点覆盖区间
Radar Installation POJ 1328
Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d.
We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.
Figure A Sample Input of Radar Installations
(图片有问题!!)
Input
The input consists of several test cases. The first line of each case contains two integers n (1<=n<=1000) and d, where n is the number of islands in the sea and d is the distance of coverage of the radar installation. This is followed by n lines each containing two integers representing the coordinate of the position of each island. Then a blank line follows to separate the cases.
The input is terminated by a line containing pair of zeros
Output
For each test case output one line consisting of the test case number followed by the minimal number of radar installations needed. “-1” installation means no solution for that case.
Sample Input
3 2
1 2
-3 1
2 1
1 2
0 2
0 0
Sample Output
Case 1: 2
Case 2: 1
题意
平面直角坐标系上有n个点,求在x轴上找尽量少的点,以这些点为圆心画一个半径为d的圆,使得给定的点都在画出来的圆里。如果不能输出-1。
分析
我的思路是由最后一句话“如果不能输出-1”启发的。
怎么会不能呢?因为x轴上所有点到某点的距离都超过了d。
也就是说,以这个点画一个半径为d的圆,它与x轴无交点。
如图:
我们知道圆心和半径,可以求出圆的方程:(x-a)²+(y-b)²=d²,
它与x轴即y=0无交点,则说明联立圆和y=0,无解。
回到图形,
如果想要在x轴上选点画圆覆盖(a,b),那么这个点的横坐标就一定在[a-d²+b²,a+d²-b²]区间内。
因此,这道题就变成了在数轴上选最少的点,覆盖给定线段。
这就类似于整数区间了。
假设数轴上有很多段区间,我们把它们从数轴上分离出来。
把一维拓展到二维,就很直观了,取点的过程可以理解为画一条铅垂线来割这些线段。
让我们先来割第一条线段。随便画几条线。
我们可以直观地感受到,从靠第一条线段的地方割,越容易割到其他的线,也就是说有更多的线段不用多浪费线去割。
为什么呢?
图上可以看到,其他的线段都比第一条线段“靠右”,因此,选择割点的时候,如果想要尽量多覆盖,割点也要尽量“靠右”。
怎么用程序实现靠左和靠右呢?我们可以将线段以右端点排序,就可以达到如上效果。
代码
#include<cstdio>#include<cmath>#include<algorithm>#include<iostream>using namespace std;void Read(int &p){ p=0; int f=1; char c=getchar(); while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar(); while(c>='0'&&c<='9') p=p*10+c-'0',c=getchar(); p*=f;}struct point{ double l,r; bool operator < (const point &x) const { if(r!=x.r) return r<x.r; return l<x.l; }}p[1234];int n,x,y,d,sp;double delta;int main(){ while(1) { Read(n); Read(d); if(!n&&!d) break; bool f=1; for(int i=1;i<=n;i++) { Read(x); Read(y); delta=1.0*d*d-1.0*y*y; if(d>=y) p[i].l=x-sqrt(delta), p[i].r=x+sqrt(delta); else f=0; } if(!f) { printf("Case %d: -1\n",++sp); continue; } sort(p+1,p+1+n); double now=p[1].r; int ans=1; for(int i=2;i<=n;i++) if(p[i].l>now) ans++,now=p[i].r; printf("Case %d: %d\n",++sp,ans); }}
- 【原创】【区间上的贪心 第一篇】Poj 1328 Radar Installation
- POJ 1328 Radar Installation(区间贪心)
- POJ 1328 Radar Installation【贪心 区间问题】
- POJ 1328(Radar Installation 区间贪心)
- [POJ 1328] Radar Installation (区间贪心)
- POJ 1328 Radar Installation 贪心区间选点
- POJ 1328 Radar Installation 区间贪心
- POJ 1328 Radar Installation 区间贪心
- poj-1328 Radar Installation(贪心+区间选点)
- poj Radar Installation 【贪心 区间】
- poj 1328 Radar Installation (简单的贪心)
- [ACM] POJ 1328 Radar Installation (贪心,区间选点问题)
- poj 1328 Radar Installation 【贪心】【区间选点问题】
- 【贪心专题】POJ 1328 G - Radar Installation (区间覆盖)
- POJ - 1328 Radar Installation (贪心,区间选点问题)
- POJ 1328 Radar Installation(贪心+区间选点问题)
- POJ 1328 Radar Installation 贪心(区间选点)
- POJ 1328 Radar Installation 贪心最少区间问题
- Android 小游戏之五子棋 代码简单实现
- CSS 单边 inner box shadow
- Lucene是什么?
- vimtutor中文版1.7
- 读书笔记-真实的诸葛亮-2
- 【原创】【区间上的贪心 第一篇】Poj 1328 Radar Installation
- js优化
- 弹出全盖隐藏窗口 -- css,js,htm
- Map集合,List集合,Array数组,Iterator迭代,Collection集合,Set集合的多种遍历方式
- #OSG+VS#第二十一周
- PHP01-Apache的安装配置
- 存溢出和内存泄漏的区别、产生原因以及解决方案
- Python中的虚拟变量(dummy variables)
- Frosh Week (hdu 3743 树状数组)